细述 Java垃圾回收机制→Types of Java Garbage Collectors

本文非原创,翻译自Types of Java Garbage Collectors
在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的。和C语言不同的是Java程序员不须要手动写垃圾回收相关的代码。这是使得Java如此流行,同时也是Java能帮助程序员写出更好的Java应用的优势之一。java

本文将会介绍各类不一样类型的Java垃圾回收器。垃圾回收是Java用来将程序员从分配和释放内存的杂事中解放出来的自动过程。
Java有四种类型的垃圾回收器,程序员

  1. Serial Garbage Collector数组

  2. Parallel Garbage Collector服务器

  3. CMS Garbage Collector并发

  4. G1 Garbage Collectorapp

垃圾回收器
这四种类型的垃圾回收器都有各自的优势和缺点。最重要的是程序员能够选择JVM使用哪一种类型的垃圾回收器。咱们能够经过传递不一样的JVM参数来设置使用哪个。各个垃圾回收器在不一样应用场景下的效率会有很大的差别。所以了解各类不一样类型的垃圾回收器以及它们的应用场景是很是重要的。性能

Serial Garbage Collector

串行垃圾回收器控制全部的应用线程。它是为单线程场景设计的,只使用一个线程来执行垃圾回收工做。它暂停全部应用线程来执行垃圾回收工做的方式不适用于服务器的应用环境。它最适用的是简单的命令行程序。优化

使用-XX:+UseSerialGCJVM参数来开启使用串行垃圾回收器。spa

Parallel Garbage Collector

并行垃圾回收器也称做基于吞吐量的回收器。它是JVM的默认垃圾回收器。与Serial不一样的是,它使用多个线程来执行垃圾回收工做。和Serial回收器同样,它在执行垃圾回收工做是也须要暂停全部应用线程。命令行

CMS Garbage Collector

并发标记清除(Concurrent Mark Sweep,CMS)垃圾回收器,使用多个线程来扫描堆内存并标记可被清除的对象,而后清除标记的对象。CMS垃圾回收器只在下面这两种情形下暂停工做线程,

  1. 在老年代中标记引用对象的时候

  2. 在作垃圾回收的过程当中堆内存中有变化发生

对比与并行垃圾回收器,CMS回收器使用更多的CPU来保证更高的吞吐量。若是咱们能够有更多的CPU用来提高性能,那么CMS垃圾回收器是比并行回收器更好的选择。

使用-XX:+UseParNewGCJVM参数来开启使用CMS垃圾回收器。

G1 Garbage Collector

G1垃圾回收器应用于大的堆内存空间。它将堆内存空间划分为不一样的区域,对各个区域并行地作回收工做。G1在回收内存空间后还当即堆空闲空间作整合工做以减小碎片。CMS倒是在所有中止(stop the world,STW)时执行内存整合工做。对于不一样的区域G1根据垃圾的数量决定优先级。

使用-XX:UseG1GCJVM参数来开启使用G1垃圾回收器。

Java 8 的优化

在使用G1垃圾回收器是,开启使用-XX:+UseStringDeduplacatonJVM参数。它会经过把重复的String值移动到同一个char[]数组来优化堆内存占用。这是Java 8 u 20引入的选项。

以上给出的四个Java垃圾回收器,在何时使用哪个去决于应用场景,硬件配置和吞吐量要求。

Garbage Collection JVM Options

下面是些主要的与Java垃圾回收相关的JVM选项。
Type of Garbage Collector to run

选项 描述
-XX:+UseSerialGC 串行垃圾回收器
-XX:+UseParallelGC 并行垃圾回收器
-XX:+UseConcMarkSweepGC CMS垃圾回收器
-XX:ParallesCMSThread= CMS垃圾回收器–使用的线程数量
-XX:UseG1GC G1垃圾回收器

GC 优化选项

选项 描述
-Xms 初始堆内存大小
-Xmx 最大堆内存大小
-Xmn 年轻代的大小
-XX:PermSize 初始永久代的大小
-XX:MaxPermSize 最大的永久代的大小

Example Usage of JVM GC Options

java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar
相关文章
相关标签/搜索