0

0

Hotspot--垃圾回收器(JVM)详细讲解

巴扎黑

巴扎黑

发布时间:2017-07-17 11:51:08

|

2219人浏览过

|

来源于php中文网

原创

  前两篇《jvm入门——运行时数据区》《jvm常见垃圾回收算法》所提到的实际上jvm规范以及常用的垃圾回收算法,具体的jvm实现实际上不止一种,有jrockitj9等待,当然最有名当属hotspot jvm。下面是hotspot jvm的整体架构图,本文着重介绍hotspot中的垃圾回收器(garbage collector)。

  现有的HotSpot垃圾回收器以及之间的关系和应用范围如下图所示:

  其中G1 GC非常显眼的处于新生代和老年代之间,可以猜测这个G1 GC可同时运用在新生代和老年代,确实可以说G1是一个划时代新概念GC

  在介绍上面的垃圾回收器之前要先说明JVM虚拟机的Client模式和Server模式,Java所能做的事一是做客户端简单说就是GUI桌面应用程序,二是可以用作服务器端。两种模式Client模式启动快,启动后性能较差,Server模式启动慢,启动后性能较高。

Serial GC-XX:+UseSerialGC,复制算法,新生代

  这是一个比较古老的垃圾收集器,我理解它为简单粗暴,简单粗暴的方法往往可以应对简单的环境,事实上Serial GCClient模式下正是如此。它是一个串行的垃圾收集器,串行意味着就算是有多核处理器也不会有多个线程来并行回收,在串行的同时,其它的正常工作线程也要停止工作,称为“Stop the world”。这实际很好理解,你在清扫垃圾的时候,总不希望有人同时在丢垃圾吧。当然Serial GC在如今的HotSpot JVMServer模式下已经几乎废弃。另外,它工作使用垃圾回收的复制算法工作在Java堆的新生代。   

ParNew GC-XX:+UseParNewGC复制算法新生代

  ParNew GC实际上是Serial GC的多线程版本。上面提到了Serial GC即使是多核CPU的环境下也是单线程进行垃圾内存的回收。此垃圾收集器侧可以做到多线程环境下进行垃圾内存的回收,这个多线程也仅仅是垃圾回收的多线程,而不是与用户线程并发执行。并且只有它能与CMS老年代的垃圾回收器配合使用,而CMS又恰恰是划时代意义的垃圾回收器,所以当JVM的老年代垃圾回收器是CMS的话,新生代的垃圾回收器通常是ParNew GC

Parallel GC-XX:+UseParallelGC,复制算法,新生代)

  它有点和ParaNew GC类似,从名字上来看也是并行的多线程收集器。我们之前提到过,在进行GC的过程中要“Stop the world”,停顿时间越短当然越好,很多垃圾回收器(包括前两个)关注的就是如何提高停顿时间。而Parallel GC关注的则是吞吐量。它关注的是垃圾回收的整体耗时,如果垃圾回收所占用的整体耗时较短,则吞吐量高,CPU就能将越多的时间用于任务的执行上,(吞吐量 任务运行时间 (任务运行时间 垃圾回收时间))

Serial Old GC-XX:+UseSerialOldGC,标记-压缩算法,老年代)

  它是Serial GC的老年代版本,同样也是单线程,也能与Parallel GC配合使用作为它的老年代GC

玄鲸Timeline
玄鲸Timeline

一个AI驱动的历史时间线生成平台

下载

Parallel Old GC-XX+UseParallelOldGC,标记-压缩算法,老年代)

  为了避免如果在新生代选择了Parallel GC而老年代则只有选择Serial Old GC的困境,出现了Parallel GC的老年代版本——Parallel Old GC。故如果在一些需要高吞吐量的常量利用Parallel GCParallel Old GC组合将会是一个很好的选择。

☆Concurrent Mark Sweep(CMS) GC -XX:+UseConcMarkSweepGC,标记-清除算法,老年代)

  CMS GC几乎占据着JVM老年代垃圾收集器的半壁江山,它划时代的意义就是垃圾回收线程几乎能用户线程做到同时工作。几乎是因为它还是不能做到完全不需要“Stop the world”,只是它尽可能的缩短了停顿时间。

它的整个垃圾回收过程可分为以下4个步骤:

  1. 初始标记

  2. 并发标记

  3. 重新标记

  4. 并发清理

  这4个步骤初始标记重新标记需要进行短暂的“Stop the world”,并发标记的过程实际上就是和用户线程同时工作,也就是一边丢垃圾,一边打扫,这样就会带来一个问题,如果垃圾的产生是在标记后发生,那么这次垃圾就只有等到下次再回收。当然等到标记完了过后垃圾自然不会和用户线程产生冲突,而清理过程就能和用户线程同时处理了。对于此垃圾回收器有一个比较显著且不可避免的一个问题就是它所采用的是标记-清除算法,也就是说它不同会压缩存活的对象,这样就会带来内存空间碎片化的问题,如果出现需要分配一个连续的较大的内存空间则只能触发一次Full GC。上一篇《JVM常见垃圾回收算法》中谈到了在新生代的垃圾回收称为“Minor GC”,老年代的垃圾回收称为“Major GC”,而“Full GC”则是在整个堆上触发一次垃圾回收,可想而知代价会相当高,而且此时不得不暂停用户线程,只能针对具体使用场景通过调整CMS GC的参数对其进行调整优化。

Garbage-First(G1) GC(-XX:+UseG1GC)

  G1 GC较之前所有的垃圾回收器都不同,从开头的第二幅图就能看出,它涵盖了新生代和老年代,或者说仅仅是从逻辑上还保留新生代老年代这种说法,实际上它已不存在内存分代,它在JDK6中仅仅是实验版,在JDK7u4过后才正式商用,对于此垃圾回收器我将会单独对其讲解,另外它的论文地址在:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.63.6386&rep=rep1&type=pdf

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

8

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

6

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

1

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

17

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

18

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号