您的位置:首页 > 编程语言 > Java开发

Java GC 垃圾回收器的类型小结

2017-08-24 21:59 253 查看
 阅读了Java paper的垃圾回收器类型文章,在此做一个小结,文章部分翻译自java
paper gc collector,部分自己做的总结,图片来自网络,在此仅用作理解表达之用。

一、JVM GC 垃圾回收器类型

JVM的垃圾回收器大致分为四种类型:



(图片来自网络)

1、串行垃圾回收器  Serial Garbage Collector

串行垃圾回收器在进行垃圾回收时,它会持有所有应用程序的线程,冻结所有应用程序线程,使用单个垃圾回收线程来进行垃圾回收工作。
串行垃圾回收器是为单线程环境而设计的,如果你的程序不需要多线程,启动串行垃圾回收。(一般是command line程序)
使用方法:-XX:+UseSerialGC 

Ps:在jdk client模式,不指定VM参数,默认是串行垃圾回收器



(图片来自网络)

2、并行垃圾回收器  Parallel Garbage Collector

并行垃圾回收器在进行垃圾回收时,同样会持有所有应用程序的线程,并冻结所有应用程序线程,来进行垃圾回收工作。
唯一和串行垃圾回收器不同的是,并行垃圾回收器是使用多线程来进行垃圾回收工作的。

jdk client模式下使用串行垃圾回收器。



(图片来自网络)

3、并发标记扫描垃圾回收器 CMS Garbage Collector

Concurrent Mark Sweep (CMS)垃圾回收器使用并发标记算法,使用多线程来扫描heap memory来标记实例,然后清理被标记过的实例。
CMS垃圾回收器有时候会Hold所有的应用程序线程,但有时候只会Hold部分应用程序线程。

什么时候会暂停所有应用程序线程?
1、在老年代中,当标记被引用的对象时
2、如果正在垃圾回收时,并行的改变在heap memory发生了。

相比前两个垃圾回收器来说,CMS一定程度上缩短了应用程序GC时暂停的时间。
相比并行垃圾回收,CMS收集器使用更多的CPU来换取更多的应用程序吞吐量。
但是CMS进行恢复内存后的内存空间压缩整理时,会Stop the world。

如果能分配更多的CPU给垃圾回收器,那么CMS会是一个比并行垃圾回收更好的选择。

XX:+USeParNewGC



(图片来自网络)

4、G1垃圾回收器  G1 Garbage Collector

G1垃圾回收器是用在heap memory很大的情况下,把heap划分为很多很多的region块,然后并行的对其进行垃圾回收。
G1垃圾回收器在清除实例所占用的内存空间后,还会做内存压缩。

G1垃圾回收器回收region的时候基本不会STW,而是基于 most garbage优先回收 的策略来对region进行垃圾回收的。

–XX:+UseG1GC

java8中,使用-XX:+UseStringDeduplication
This optimizes the heap memory by removing duplicate String values to a single char[] array
这个优化会优化冗余的string为一个char数组。



(图片来自网络)

二、四种垃圾回收器的选用决定因素:

1、应用程序的场景

2、硬件的制约

3、吞吐量的需求

串行垃圾回收是最简单的也是效率最低的,如果只是控制台的单线程程序,简单任务,并且机器配置不高,推荐使用。

并行垃圾回收器是64bit server默认的垃圾回收器,一般我们工作和生产上默认不配置,都是并行垃圾回收。对于一般的不要求吞吐的应用,并且硬件资源不是太充足的情况下,并行垃圾回收器差不多能满足需求。

CMS垃圾回收器是对并行垃圾回收器的一个优化,它以CPU和系统资源为代价,换取GC的延迟。不会一GC就STW,而是根据情况STW。一定程度上是资源换取速度。

G1垃圾回收器是针对于大heap的垃圾回收器,如果heap分配的足够大,分的region的优先级回收策略会优先清理垃圾多的region.并且减少了内存空间碎片,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC。

三、配置

OptionDescription
-XX:+UseSerialGCSerial Garbage Collector 串行垃圾回收器
-XX:+UseParallelGCParallel Garbage Collector并行垃圾回收器
-XX:+UseConcMarkSweepGCCMS Garbage Collector并发标记垃圾回收器
-XX:ParallelCMSThreads=CMS Collector – number of threads to use 并发标记垃圾回收器使用的线程数,通常是cpu个数
-XX:+UseG1GCG1 Gargbage Collector 使用G1垃圾回收器

GC Optimization Options

OptionDescription
-XmsInitial heap memory size 初始化heap大小 -Xms512M
-XmxMaximum heap memory size 设置最大的heap大小
-XmnSize of Young Generation 年轻代的大小
-XX:PermSizeInitial Permanent Generation size 初始化永久带的大小
-XX:MaxPermSizeMaximum Permanent Generation size 最大的永久带大小
Parallel GC 并行垃圾回收策略举例:

Java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
 -XX:+UseParallelOldGC MaxGCPauseMillis=100
[code] -XX:MaxGCPauseMillis=100

[/code]


CMS GC 并发标记清楚垃圾回收策略举例:

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k-XX:ParallelGCThreads=20  
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
  
-XX:CMSFullGCsBeforeCompaction=5
 -XX:+UseCMSCompactAtFullCollection

Eg:

java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar

[/code]

更多详细配置,请参考:http://blog.sina.com.cn/s/blog_4080505a0101i6cr.html

四、查看垃圾回收器

我们知道jvm分client 和 server模式。

如果启动jvm不指定模式,jdk会根据当前的操作系统配置来启动不同模式的jvm。

默认64bit操作系统下都会是server模式的jvm。

java -XX: +PrintCommandLineFlags -version

-XX:MaxHeapSize=1073741824 -XX:ParallelGCThreads=85
-XX: +PrintCommandLineFlags -XX: +UseParallelGC
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b07)
Java HotSpot(TM) Server VM (build 14.0-b15, mixed mode)


For J2SE 5.0, the definition of a server-class machine is one with at least 2 CPUs and at least 2GB of physical memory.

对于jdk5,区分是否是server还是client jvm模式,至少2个CPU和2GB的物理内存。

[align=center]Platform[/align]
[align=center]Default VM[/align]
ArchitectureOS[align=center]client VM[/align]
if server-class, server VM;

otherwise, client VM
[align=center]server VM[/align]
SPARC 32-bitSolaris[align=center] [/align]
[align=center]X[/align]
[align=center] [/align]
i586Solaris[align=center] [/align]
[align=center]X[/align]
[align=center] [/align]
Linux[align=center] [/align]
[align=center]X[/align]
[align=center] [/align]
Microsoft Windows[align=center]X[/align]
[align=center] [/align]
[align=center] [/align]
SPARC 64-bitSolaris[align=center]—[/align]
[align=center] [/align]
[align=center]X[/align]
AMD64Linux[align=center]—[/align]
[align=center] [/align]
[align=center]X[/align]
Microsoft Windows[align=center]—[/align]
[align=center] [/align]
[align=center]X[/align]
Legend:   X = default VM      — = client
VM not provided for this platform

五、总结:

    垃圾回收器目前分为四种类型, 串行,并行,并发标记,G1。

    小数据量和小型应用,使用串行垃圾回收器即可。

    对于对响应时间无特殊要求的,可以使用并行垃圾回收器和并发标记垃圾回收器。(中大型应用)

    对于heap可以分配很大的中大型应用,使用G1垃圾回收器比较好,进一步优化和减少了GC暂停时间。

    没有银弹,针对不同的场景,选用不同的垃圾回收器。

参考文献:

http://javapapers.com/java/types-of-java-garbage-collectors/

http://blog.sina.com.cn/s/blog_4080505a0101i6cr.html

http://www.techpaste.com/2012/02/20/default-jvm-settings-gc-jit-java-heap-sizes-xms-xmx-operating-systems/#more-3569

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/server-class.html
转载出自:http://blog.csdn.net/oopsoom/article/details/40374897
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Jvm 垃圾收集器 G1