JVM垃圾回收器是Java面试经常被问到的问题,下面重点详解常见的几种JVM垃圾回收器@mikechen
Serial串行收集器
Serial垃圾回收器是最基本的垃圾回收器,它使用单个线程进行垃圾回收。
如下图所示:
在执行垃圾回收时,Serial垃圾回收器会暂停所有应用程序线程,直到垃圾回收完成。
由于Serial垃圾回收器是单线程的,因此它的优点是简单且占用资源较少,它适用于小型应用程序,例如移动应用程序和桌面应用程序。
Parallel并行收集器
与Serial垃圾回收器不同,Parallel垃圾回收器使用多个线程来加速垃圾回收过程,从而提高了应用程序的性能。
如下图所示:
由于Parallel垃圾回收器使用多线程,因此它可以在多个CPU上并发执行垃圾回收,从而提高了垃圾回收的效率。
Parallel垃圾回收器适用于中等大小的应用程序,特别是那些需要高吞吐量的应用程序,例如:Web应用程序和大规模企业应用程序。
CMS收集器
CMS(Concurrent Mark Sweep)垃圾回收器,是一种使用标记清除算法的低暂停时间垃圾回收器,CMS收集器主要用于收集老年代的垃圾。
CMS垃圾回收器的工作方式是分为两个阶段:标记阶段和清除阶段。
如下图所示:
在标记阶段:CMS垃圾回收器会使用多个线程来标记Java堆内存中的垃圾对象。
与此同时,应用程序可以继续运行,因此垃圾回收过程不会暂停应用程序的执行。
在清除阶段:CMS垃圾回收器会清除已标记的垃圾对象,并回收内存空间。
G1垃圾回收器
G1垃圾收集器采用的是分代收集的思想,将Java堆内存分成多个大小相等的区域,每个区域被称为一个Region。
如下图所示:
1)G1堆内存结构
默认把堆内存按照2048份均分,大小区间最小1M、最大32M,总之是2的幂次方。
2)G1堆内存分配
每个Region被标记了E、S、O和H,这些区域在逻辑上被映射为Eden,Survivor和老年代。
Humongous区域是为了那些存储超过50%标准region大小的对象而设计的,它用来专门存放巨型对象。
如果一个H区装不下一个巨型对象,那么G1会寻找连续的H分区来存储。
G1垃圾回收器的优点是能够在垃圾回收期间减少应用程序的暂停时间,同时也能够避免内存碎片问题。
G1垃圾回收器它适用于那些需要高可预测性和低暂停时间的大型应用程序,例如金融交易系统等。
ZGC垃圾收集器
ZGC也称为The Z Garbage Collector,ZGC垃圾收集器是JDK 11中推出的一款追求极致低延迟的性质的JVM垃圾收集器。
与CMS中的ParNew和G1类似,ZGC也采用标记复制算法,不过ZGC对该算法做了重大改进。
ZGC收集器采用了读屏障技术,这意味着在进行垃圾收集时,ZGC可以非常快速地扫描整个Java堆内存,同时几乎不会产生停顿。
ZGC垃圾回收器的优点是能够在垃圾回收期间减少应用程序的暂停时间,并在不影响吞吐量的情况下回收大量内存。
ZGC垃圾回收器适用于那些需要低延迟和大内存回收能力的应用程序,例如内存密集型应用程序和大数据应用程序。
Epsilon垃圾收集器
Epsilon垃圾回收器是一种实验性的垃圾回收器,它的设计目标是完全消除垃圾回收的暂停时间。
Epsilon垃圾回收器的优点是能够完全消除垃圾回收的暂停时间,从而提高应用程序的性能和可预测性。
Epsilon适用于那些需要极高性能和可预测性的应用程序,例如高性能计算和科学计算等领域。
要启用了 Epsilon GC 的 JVM 上启动应用程序或微服务,请包括以下 JVM 选项:
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
总之,Epsilon垃圾回收器是一种完全消除垃圾回收暂停时间的实验性垃圾回收器,适用于需要极高性能和可预测性的应用程序。
Shenandoah垃圾收集器
Shenandoah垃圾收集器于JDK 12中首次引入,主要针对需要大内存和低延迟的应用场景。
Shenandoah垃圾收集器的主要优点在于它可以在很短的停顿时间内完成垃圾回收操作,并且可以处理非常大的堆内存。
以上就是JVM垃圾回收器详解,更多JVM内容请查看:JVM(Java虚拟机)从0到1全部合集
mikechen睿哥
mikechen睿哥,十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》