JVM垃圾收集器相关信息

        学习Java的朋友肯定都知道JVM(Java Virtual Machine),是这个神奇的虚拟机实现了Java的各类操作。在实际开发过程中,JVM的优化对我们来说是有很大作用的。那么我们这次先来聊聊Java的垃圾回收器。

        注:要深入浅出JVM真的很难,而笔者读过的比较好的书是周志明老师的《深入理解Java虚拟机》,所以博客中引用了周老师书中的一部分文字以及图片。

       

JVM垃圾收集器相关信息

对象是否存活?——判定存活算法

        引用计数法:

              引用计数法十分简单,判定效率高,Python使用了该判定方法。

             给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效  ,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。

        可达性分析法:

             可达性分析法十分热门,包括Java, C#等语言都使用了这种分析方法

             通过一系列的称为“GCRoots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(ReferenceChain),当一个对象到GCRoots没有任何引用链相连(用图论的话来说,就是从GCRoots到这个对象不可达)时,则证明此对象是不可用的。

JVM垃圾收集器相关信息

               

如何垃圾回收?——垃圾回收算法

        标记-清除:

             标记-清除方法实现跟方法名一样:分为两个阶段,标记所有要回收的对象;清除所有被标记的对象。

             该方法是复制算法与标记-整理算法的前身,这两者都是改进了标记-清除算法的部分缺点:

             1.效率问题

                          标记,清除两个阶段都需要花费很多的时间;

             2.空间利用率问题

                          清理完对象后会是空间碎片化,当创建大对象时可能导致内存不够提前触发一次GC

             如图:

JVM垃圾收集器相关信息

        复制算法:

                复制算法是为了解决效率问题而衍生出的清除算法,普遍用于回收新生代内存;老年代的对象存活率高,每次复制太多对象会大大降低效率,在老年代也难以找到“担保”,故复制算法不对老年代使用。

                阶段一:复制算法将内存分为大小相等的两块,每次只使用一块,当内存不足时将依然存活的对象复制到另一块去。优点:效率高,避免内存碎片化。但缺点也很明显,空间成本太高,只使用了一半的空间。

                阶段二:IBM公司的专门研究表明,新生代中的对象98%是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor[1]。当回收时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,也就是每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的内存会被“浪费”。当然,98%的对象可回收只是一般场景下的数据,我们没有办法保证每次回收都只有不多于10%的对象存活,当Survivor空间不够用时,需要依赖其他内存(这里指老年代)进行分配担保(HandlePromotion)。

        标记-整理算法:复制算法在对象存活率高的老年代不适用,常常使用标记-整理法:在标记好需回收对象后,使全对象向一端移动,然后直接清理掉边界外的内存。

JVM垃圾收集器相关信息

        分代收集算法:这种算法只是根据各个年代的特点,新生代-->复制算法,老年代-->标记-整理法

垃圾回收的实现?——垃圾收集器

 

主要特点

垃圾收集算法

回收区域

一句话总结

Serial

单线程、简单

复制算法

新生代

简单高效

ParNew

多线程

复制算法

新生代

Serial多线程版,可配合CMS

Parallel Scavenge

并行,多线程

复制算法

新生代

重视吞吐量,

无法配合CMS

Serial Old

单线程

标记-整理

老年代

Serial的老年代

Parallel Old

并行,多线程

标记-整理

老年代

Parallel Scavenge老年代版本

CMS

并发,停顿短

标记-清理

老年代

并发低停顿,

标记-清理

G1

并行,并发;

分代收集;

可预测停顿;

复制算法(局部)

标记-整理(整体)

Region

成熟版问世时间短;但可以尝试