首页 > Java, 挨踢(IT) > Java垃圾回收(3):常见的四种垃圾收集器

Java垃圾回收(3):常见的四种垃圾收集器

2014年11月23日 发表评论 阅读评论 1,558 人阅读    

本节我们将介绍几种可用的Java垃圾收集器。垃圾回收是一个自动进程,它把开发人员从内存的分配与回收的杂务中解放出来。本文是“Java垃圾回收系列”的第三篇。在上一篇,也就是第二篇中,我们了解了Java垃圾回收的工作原理,这节非常有意思,我推荐你看一看。在第一篇“Java垃圾回收入门”中,我们介绍了Java虚拟机架构,堆内存模型以及Java相关的一些术语。

Java有四种垃圾收集器:

  1. Serial Garbage Collector
  2. Parallel Garbage Collector
  3. CMS Garbage Collector
  4. G1 Garbage Collector

D瓜哥注

这是四种类型的垃圾收集器。具体到每一个实现,在Oracle提供的官方JDK中就有Serial Garbage Collector、ParNew Garbage Collector、Parallel Scavenge Garbage Collector、Serial Old Garbage Collector、Parallel Old Garbage Collector、CMS Garbage Collector、G1 Garbage Collector等七种垃圾收集器。以后有机会再专门写文章做详细介绍!

四种Java垃圾收集器工作流程对比

这四种垃圾收集器每一种都有自己的优点与不足。最重要的是,我们开发人员可以选择Java虚拟机使用的垃圾收集器的类型。我们可以通过传从参数的形式,来选择它们。每一种垃圾收集器都有非常大的特点,都可以提供完全不同的性能。必须严谨而准确地理解这集中垃圾收集器,然后基于应用的使用情况正确选择。

1. Serial Garbage Collector

Serial Garbage Collector通过暂停所有应用的线程来工作。它是为单线程工作环境而设计的。它中使用一个线程来进行垃圾回收。这种暂停应用线程来进行垃圾回收的方式可能不太适应服务器环境。它最适合简单的命令行程序。

通过-XX:+UseSerialGC参数来选用Serial Garbage Collector。

2. Parallel Garbage Collector

Parallel Garbage Collector也被称为吞吐量收集器(throughput collector)。它是Java虚拟机的默认垃圾收集器。与Serial Garbage Collector不同,Parallel Garbage Collector使用多个线程进行垃圾回收。与Serial Garbage Collector相似的地方时,它也是暂停所有的应用线程来进行垃圾回收。

3. CMS Garbage Collector

Concurrent Mark Sweep (CMS) Garbage Collector使用多个线程来扫描堆内存来标记需要回收的实例,然后再清除被标记的实例。CMS Garbage Collector只有在如下两种情景才会暂停所有的应用线程:

  1. 当标记永久代内存空间中的对象时;
  2. 当进行垃圾回收时,堆内存同步发生了一些变化。

相比Parallel Garbage Collector,CMS Garbage Collector使用更多的CPU资源来确保应用有一个更好的吞吐量。如果分配更多的CPU资源可以获得更好的性能,那么CMS Garbage Collector是一个更好的选择,相比Parallel Garbage Collector。

通过XX:+USeParNewGC参数来选用CMS Garbage Collector。

4. G1 Garbage Collector

G1 Garbage Collector用于大的堆内存区域。它将堆内存分割成多个独立区域(Region),然后并发地对它们进行垃圾回收。在释放内存后,G1还可以压缩空闲的堆内存。但是,CMS Garbage Collector是通过“Stop The World (STW)”来进行内存压缩的。G1优先收集可回收更多内存的区域。

通过–XX:+UseG1GC参数来选用G1 Garbage Collector。

Java 8 的改进

在用G1 Garbage Collector时,可以开启-XX:+UseStringDeduplication参数。它通过将重复的字符串移动到同一个char数组中来优化堆内存的使用。该选项在Java 8u20时引用进来。

上面给出了四种垃圾收集器的介绍,至于选用哪个垃圾收集器,这个要根据应用场景、可用的硬件资源以及吞吐量的要求来确定。

Java虚拟机中的垃圾回收选项

下面是与Java收集器相关的Java虚拟机选项。

垃圾收集器选择
Option Description
-XX:+UseSerialGC Serial Garbage Collector
-XX:+UseParallelGC Parallel Garbage Collector
-XX:+UseConcMarkSweepGC CMS Garbage Collector
-XX:ParallelCMSThreads= CMS Collector – 使用的线程数
-XX:+UseG1GC G1 Gargbage Collector
垃圾回收优化选项
Option Description
-Xms 堆内存初始化尺寸
-Xmx 堆内存最大尺寸
-Xmn 新生代(Young Generation)的尺寸
-XX:PermSize 永久代(Permanent Generation)初始化尺寸
-XX:MaxPermSize 永久代(Permanent Generation)最大尺寸

D瓜哥注

在上一节Java垃圾回收的工作原理中,D瓜哥为了让示例效果尽快展示出来,使用了两个参数,不明白的可以看这里了。

Java虚拟机垃圾回收选项的使用示例
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar

在[“Java垃圾回收系列”的下一部分]()中,我们将看看如何监控、分析一个示例应用的垃圾回收情况。

原文链接:Types of Java Garbage Collectors



作 者: D瓜哥,https://www.diguage.com/
原文链接:https://wordpress.diguage.com/archives/117.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

分类: Java, 挨踢(IT) 标签: , ,