APP下载

JVM虚拟机之Garbage-First垃圾收集器

2019-08-21肖洋

商情 2019年34期

肖洋

【摘要】在JVM(Java Virtual Machine)的研究上,有很多方面的应用,但是在其最基础的依赖应用上,还要说一说性能管理相关的应用。我们通过对Garbage-First(简称G1)的研究,从各个方面总结出G1的优劣势,让各个JVM中能更优的选择相关的垃圾收集器。本文总结了G1相关特性,列举了部分的应用场景及有利条件,从而给使用者一个更正确的应用场景。

【关键词】垃圾收集器 JVM Garbage-First

一.引言:

自2000年以来,我国的互联网技术得到了突飞猛进,在相关创新、应用、研究上也有了不同程度的进展。在应用服务器上,选择垃圾回收器是最重要的环节之一,它不仅仅是有利于程序的研发,在某些场景里,更可能作为与别的应用程序的竞争优勢。

在JVM垃圾收集器历史发展上,相关的垃圾收集器已经百花齐放了。但是不同垃圾收集器,有不同的优劣势,也有不同的工作场景,所以,在应用服务器选择垃圾收集器的同时,也需要选择恰当的垃圾收集器。

JVM的垃圾收集器,从Serial收集器到ParNew,再到后面先进的CMS(Concurrent Mark Sweep),到现在使用的G1垃圾收集器以及研发阶段的Shenandoah都在对相关算法不断的升级与改造,但是任何算法都不是完美的,只有最合适某一种应用场景的算法,没有适合所有应用场景的算法。

二.G1收集器

2.1 何为G1垃圾收集器

G1(Garbage-First)垃圾收集器是目前的虚拟机垃圾收集器中比较先进的垃圾收集器之一,在JDK1.7中替换了原本的CMS垃圾收集器[1]。相比较CMS垃圾收集器,G1倍受关注的是收集器在工作时的STW(Stop The World)的时长。G1的优势非常明显,并行与并发、分代手机、空间整合、可预测性停顿等等[2]都是G1在发布时不可替代的优势,这样就使之成为现在风靡一时的垃圾回收器。

2.2 G1垃圾收集器算法特点

G1垃圾收集器作为现在最流行的垃圾回收器,当然有它一定的优势。在CMS垃圾机制时期,我们都知道JVM的堆内存,是需要进行Eden区,Servivor区和Old Genaretion区的分配[3]。但是对于G1来说,JVM并不需要分配那么复杂的内存区分配。对象的所有生命周期,都可以在一个区内完成。堆被分成一组相等的堆区域,没一个区域都是一个连续的虚拟内存区域[4]。G1在对象的生命周期里面,管理着所有对象的年龄,用其来标识该对象的生命活动,是该清除,还是保持不变或者进入下一个生命周期。

在所有的垃圾回收阶段,G1都采用标记-清除(Mark-Sweep)的算法进行计算。标记-清除算法,分两部分,首先对所有可达的存活对象进行标记;然后就是清除,对未标记的对象进行垃圾清理。G1垃圾收集器大部分都是采用的并行方式进行,只有在重新标记和重新清除阶段,是STW时间,所以这样就大大的减少了STW时间。

在垃圾清除完后,所有的空间都是碎片化的,传统的CMS是不会进行碎片化压缩[5]。所以,这时候G1就需要对所有碎片化的内存区域进行整理。在最后一次清楚SWT后,堆内存的所有空间程碎片状态。这时候G1就会将这些碎片内存整理到一个连续的内存,当然,G1是采用分区(Region)的思路,所以在对象的存储空间上,并不要求是物理内存上的连续,而可以是逻辑上的连续[6]。

三.应用场景

可以认识到G1具备很多优势,无论是并发,还是碎片整理,但是我们要知道的是G1不是实时的垃圾收集器。G1的第一个重点应用场景为解决堆内存较大的应用程序,堆内存大于6G的堆内存应用的可预测暂停时间为0.5秒。这样可预测的暂停时间,能使应用程序的运行能更加精准、稳定。

如果应用程序当前使用的是CMS或者ParallelOld,要切换到G1时,需要具备以下几个特点,将更有利:

1. 超过了一半的堆内存占用了实时数据

2. 对象的rate(分配率)或者promotion(使用率)的差异较大[7]

3. 垃圾收集暂停时长或者内存压缩时长超过0.5秒

如果具备以上特点的应用程序,有利且建议能从CMS或者ParallelOld切换到G1。

四. 总结

G1对于在未来发展中,能长期替换CMS的JVM垃圾收集器,它有着更好的解决方案,一个是堆内存压缩,能对堆内存进行密集而且细粒度的自由分配;第二个是能够预测性的知道STW的时长,这样在主观研发上,能更加精准的衔接。

对于JVM的新型垃圾收集器,在未来发展中已经形成了一个新型的垃圾收集器雏形——Shenandoah[8],它具备超低延迟,无论是在500MB内存,还是在500GB内存中,都具备相同STW时间。这样对于G1来说,在更大的内存中,具备更强的应用性。“没有最好的算法,只有适用的场景”,这才是真正的垃圾收集器最核心的算法。

参考文献:

[1]周志明.《深入理解JVM虚拟机》.机械工业出版社 2011.

[2]周志明.《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)》 .机械工业出版社 2013.

[3]http://www.cs.umd.edu/~pugh/java/broken.pdf

[4]Sun Microsystems.《Memory Management in the Java HotSpot?Virtual Machine》.2006

[5]https://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html

[6]https://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf

[7]https://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html

[8]http://openjdk.java.net/jeps/189