[置顶] 深入理解java虚拟机(五):hotspot垃圾收集算法实现

时间:2022-01-05 10:21:04

深入理解java虚拟机(一):java内存区域(内存结构划分)
深入理解java虚拟机(二):java内存溢出实战
 
深入理解java虚拟机(三):String.intern()-字符串常量池
深入理解java虚拟机(四):对象存活判定算法和垃圾收集算法
深入理解java虚拟机(五):hotspot垃圾收集算法实现 
深入理解java虚拟机(六):java垃圾收集分析实战(内存分配与回收策略)
深入理解java虚拟机(七):java垃圾收集分析总结 

深入理解java虚拟机(八):java内存分析工具-MAT和OQL

 

本文所讲的是sun hotspot虚拟机实现,主要讲解Serial,ParNew,Parallel Scavenge,Serial Old,CMS(Concurrent Marsk Sweep),Parallel  Old,G1(garbage first)垃圾收集器。

先看java堆内存结构,适用于非G1收集器外的垃圾收集器:

[置顶]        深入理解java虚拟机(五):hotspot垃圾收集算法实现


 

首先根据java对象的生存周期长短把java堆内存分成老年代和年轻代,新年代大小可以通过参数 -Xmn10M来控制
 然后年轻代又被分成3块,一个Eden区,两个大小相等的survivor区,Eden区和Survivor区的大小可以通过参数 -XX:SurvivorRatio=8来进行控制
在垃圾收集领域有个很有意思的语句“Stop the world”,原因是当执行垃圾回收时需要停止所有的用户线程。

[置顶]        深入理解java虚拟机(五):hotspot垃圾收集算法实现

1、Serial收集器

 年轻代收集器。
 采用复制算法
 顾名思义它是个单线程的收集器。Client模式下虚拟机新生代默认收集器

2、ParNew收集器

年轻代收集器。
 采用复制算法
 其实就是Serial收集器的多线程版本。
 Server模式下虚拟机新生代默认收集器。
 ParNew收集器也是使用 -XX:+UseConcMarkSwepGC选项后默认的新生代收集器,也可以使用-XX:+UseParNewGC选项来强制指定它。
 它默认开启的收集线程与CPU的数量相同,可以通过-XX:ParallelGCThreads参数来限制垃圾收集线程数。

3、Parallel Scavenge收集器

 年轻代收集器。
 采用复制算法
 并行收集器。
 关注点是达到一个可控制的吞吐量(吞吐量优先),而非其他收集器的尽可能缩短垃圾收集时用户线程的等待时间。
 所谓吞吐量就是CPU运行用户代码的时间和总耗时的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
 参数 -XX:MaxGCPauseMillis参数用于控制最大垃圾收集停顿时间。
 参数 -XX:GCTimeRatio直接设置吞吐量大小(垃圾收集时间比率,吞吐量的倒数)。

4、Serial Old收集器

老年代收集器。
 采用标记-整理算法。
 单线程,类似于Serial收集器。
 Client模式下虚拟机默认的老年代收集器

5、Parallel  Old收集器

 老年代收集器。
 采用标记-整理算法。
 多线程,类似于Parallel Scavenge收集器。
 与Parallel Scavenge收集器搭配使用。

6、CMS收集器

 老年代收集器。
 采用标记-清除算法。
 获取最短回收停顿时间为目的。
 整个过程分为4个步骤:
       初始标记
       并发标记
       重新标记
       并发清除
 其中,初始标记和重新标记这两步骤仍然需要“Stop the world”。
 默认启用的回收线程数是(CPU数量+3)/4。
 参数 -XX:CMSInitiatingOccupancyFraction的值来触发垃圾收集。

7、G1(garbage first)收集器

 当今收集器技术的发展最前沿技术。
 从jdk1.7发布。

 

附: JVM 内存布局以及垃圾收集及管理详解  http://blog.csdn.net/chaofanwei/article/details/12028831