Java是流行多年的编程语言,深受广大小伙伴的欢迎,其主要有两个特点:
JVM中的垃圾收集器一直在不断发展中,比较成熟的垃圾回收器有串行回收器、并行回收器、标记回收器、垃圾优先回收器等,JDK11中引入了ZGC,JDK12中引入另外一款垃圾回收器Shenandoah。
虽然垃圾回收器在不断更新,但是垃圾收集算法基本没变:
复制、标记清除、标记压缩。
不同的垃圾收集器都是基于上面这些基本方法实现的,不同垃圾收集器的区别在于亮点:
本文主要来聊下面几种垃圾回收器的特性及如何选择
G1
收集器
G1
的全称是 Garbage-First,意为垃圾优先,哪一块的垃圾最多就优先清理它。
G1 GC
最主要的设计目标是:将STW
(stop the world) 停顿的时间和分布,变成可预期且可配置的。
事实上,G1 GC
是一款软实时垃圾收集器,可以为其设置某项特定的性能指标。例如可以指定:在任意 xx 毫秒时间范围内,STW
停顿不得超过 yy 毫秒。举例说明:任意 1 秒内暂停时间不超过 5 毫秒。G1 GC 会尽力达成这个目标(有很大概率会满足,但并不完全确定)。
JDK
7开始使用,JDK
8非常成熟,JD
9默认的垃圾收集器,适用于新老生代。
G1致力于在多CPU和大内存服务器上对垃圾回收提供软实时目标(soft real -time goal)和高吞吐量(high throuhput)。
ZGC
收集器ZGC(Z Garbage Collector)作为一种比较新的收集器,目前还没有得到大范围的关注。作为一款低延迟的垃圾收集器,它有如下几个亮点:
•停顿时间不会超过 10ms•停顿时间不会随着堆的增大而增大(控制停顿时间在10ms内)
•支持堆的大小范围很广(8MB-16TB)
在ZGC中,连逻辑上的也是重新定义了堆空间(不区分年轻代和老年代),只分为一块块的page,每次进行GC时,都会对page进行压缩操作,所以没有碎片问题。虽然ZGC属于很新的GC技术, 但优点不一定真的出众,ZGC只在特定情况下具有绝对的优势, 如巨大的堆和极低的暂停需求。而实际上大多数开发在这两方面都不太成问题(尤其是在服务器端), 而对GC的性能/效率更在意。也有一种观点认为ZGC是为大内存、多cpu而生,它通过分区的思路来降低STW。
垃圾收集器分类
停顿时间越短就越适合需要和用户交互的程序,良好的响应速度能提升用户体验;高吞吐量则可以高效地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
小结:这两个指标也是评价垃圾回收器好处的标准,其实调优也就是在观察者两个变量。
JVM
自己选JVM
自己选如何开启需要的垃圾收集器
-XX:+UseSerialGC
-XX:+UseSerialOldGC
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:+UseConcMarkSweepGC
-XX:+UseG1GC