这篇文章我们来学习下所有可用的垃圾收集器类型。java目前有四种类型的垃圾收集器:
1.串行垃圾收集器(Serial Garbage Collector);
2.并行垃圾收集器(Parallel Garbage Collector);
3.CMS垃圾收集器(CMS Garbage Collector);
4.G1垃圾收集器(G1 Garbage Collector);
每种类型都有其优点和缺点,最重要的是我们开发者可以通过jvm参数为JVM选择不同的垃圾收集器。每种垃圾收集器关注点都不同,其带来的应用体验也有很大不同,因而理解这些垃圾收集器类型非常重要,它会关系到我们能否在不同的应用环境下选择最正确的垃圾收集器类型。
1.串行垃圾收集器
串行垃圾收集器工作时会暂停所有应用线程,它是为单线程环境设计的。它仅仅使用一个线程进行垃圾回收。它的这种暂停其他所有线程的行为("stop the world")对于服务端的环境来说并不适合,其仅仅适合简单的命令行程序。
使用 -XX:+UseSerialGC 参数配置此垃圾收集器。
2.并行垃圾收集器
它也被称为吞吐量收集器(throughput collector)。它是虚拟机默认的垃圾收集器。与串行垃圾收集器不同的是此垃圾收集器使用多线程回收垃圾。与串行垃圾收集器类似的是它同样也会暂停所有应用线程当它在进行垃圾回收的时候。
3.CMS垃圾收集器
并发标记-清除垃圾收集器(Concurrent Mark Sweep Garbage Collector
)使用多线程扫描堆内存标记待回收对象然后清除被标记对象。CMS垃圾收集器仅仅在下面两个情景下暂停所有应用线程:
1.标记老年代的垃圾对象时;
2.垃圾收集时堆内存大小发生改变时
与并行垃圾收集器相比,CMS垃圾收集器需要消耗更多的CPU去提高应用的吞吐量,如果CPU允许的话,CMS垃圾收集器是一个更好的选择。
使用 -XX:+UseParNewGC 参数配置此垃圾收集器。
4.G1垃圾收集器
G1垃圾收集器用于大范围的堆区域。它将堆内存分为若干区域并在每个区域中进行并行垃圾收集,并且在垃圾回收之后会进行清理工作(清理内存碎片),但是清理工作需要暂停所有应用进程(stop the world),G1垃圾收集器优先收集具有更多垃圾的区域。
使用 -XX:+UseG1GC 参数配置此垃圾收集器。
java8的改进:
当使用G1垃圾收集器时,打开-XX:+UseStringDeduplication选项可以优化堆内存使用,它可以将重复的字符串值移到一个单独的char数组中,此选项在java 8 u 20中可用。
以上就是四种垃圾收集器类型,具体使用哪个取决于应用环境,硬件环境,以及吞吐量要求。
GC垃圾收集选项
以下是跟垃圾收集相关的关键选项:
垃圾收集器选项:
GC优化选项:
示例:
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar
下一篇我们将介绍如何监控并分析垃圾收集。
原文:http://javapapers.com/java/types-of-java-garbage-collectors/