Java垃圾回收(3):常见的四种垃圾收集器
本节我们将介绍几种可用的Java垃圾收集器。垃圾回收是一个自动进程,它把开发人员从内存的分配与回收的杂务中解放出来。本文是“Java垃圾回收系列”的第三篇。在上一篇,也就是第二篇中,我们了解了Java垃圾回收的工作原理,这节非常有意思,我推荐你看一看。在第一篇“Java垃圾回收入门”中,我们介绍了Java虚拟机架构,堆内存模型以及Java相关的一些术语。
Java有四种垃圾收集器:
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虚拟机使用的垃圾收集器的类型。我们可以通过传从参数的形式,来选择它们。每一种垃圾收集器都有非常大的特点,都可以提供完全不同的性能。必须严谨而准确地理解这集中垃圾收集器,然后基于应用的使用情况正确选择。
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只有在如下两种情景才会暂停所有的应用线程:
- 当标记永久代内存空间中的对象时;
- 当进行垃圾回收时,堆内存同步发生了一些变化。
相比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
原文链接:https://wordpress.diguage.com/archives/117.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。