若有收获,请记得分享和转发哦
作为一款高效的垃圾收集器,G1在JDK7中加入JVM,在JDK9中取代CMS成为了默认的垃圾收集器。本文就来详细介绍一下这款主流垃圾收集器,希望能够对你有所帮助。
1 垃圾收集器回顾
1.1 新生代
新生代采用复制算法,主要的垃圾收集器有三个,Serial、Parallel New 和 Parallel Scavenge,特性如下:
Serial:单线程收集器,串行方式运行,GC 进行时,其他线程都会停止工作。在单核 CPU 下,收集效率最高。
Parallel New:Serial 的多线程版本,新生代默认收集器。在多核 CPU 下,效率更高,可以跟CMS收集器配合使用。
Parallel Scavenge:多线程收集器,更加注重吞吐量,适合交互少的任务,不能跟 CMS 配合使用。
1.1 老年代
Serial Old:采用标记-整理(压缩)算法,单线程收集。
Parallel Old:采用标记-整理(压缩)算法,可以跟 Parallel Scavenge 配合使用
CMS:Concurrent Mark Sweep,采用标记-清除算法,收集线程可以跟用户线程一起工作。
CMS缺点:吞吐量低、无法处理浮动垃圾、标记清除算法会产生大量内存碎片、并发模式失败后会切到Serial old。
G1:把堆划分成多个大小相等的Region,新生代和老年代不再物理隔离,多核 CPU 和大内存的场景下有很好的性能。新生代使用复制算法,老年代使用标记-压缩(整理)算法。
2 G1介绍
因为采用并发收集,G1的性能开销会更大,这可能会影响吞吐量。
5.4 G1优势
G1在任何的GC期间都可以回收老年代中全空或者占用大空间的内存。这可以避免一些不必要的GC,因为可以非常轻易地释放大量的内存空间。这个功能默认开启,可以采用 -XX:-G1EagerReclaimHumongousObjects 参数关闭。
G1可以选择对整个堆里面的String进行并行去重。这个功能默认关闭,可以使用参数 -XX:+G1EnableStringDeduplication 来开启。