首页 > 代码库 > Java GC 垃圾回收器的类型小结
Java GC 垃圾回收器的类型小结
阅读了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。
三、配置
Option | Description |
---|---|
-XX:+UseSerialGC | Serial Garbage Collector 串行垃圾回收器 |
-XX:+UseParallelGC | Parallel Garbage Collector并行垃圾回收器 |
-XX:+UseConcMarkSweepGC | CMS Garbage Collector并发标记垃圾回收器 |
-XX:ParallelCMSThreads= | CMS Collector – number of threads to use 并发标记垃圾回收器使用的线程数,通常是cpu个数 |
-XX:+UseG1GC | G1 Gargbage Collector 使用G1垃圾回收器 |
GC Optimization Options
Option | Description |
---|---|
-Xms | Initial heap memory size 初始化heap大小 -Xms512M |
-Xmx | Maximum heap memory size 设置最大的heap大小 |
-Xmn | Size of Young Generation 年轻代的大小 |
-XX:PermSize | Initial Permanent Generation size 初始化永久带的大小 |
-XX:MaxPermSize | Maximum Permanent Generation size 最大的永久带大小 |
Parallel GC 并行垃圾回收策略举例:
java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
-XX:+UseParallelOldGC
MaxGCPauseMillis=100
-XX:MaxGCPauseMillis=100
CMS GC 并发标记清楚垃圾回收策略举例:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k-XX:ParallelGCThreads=20
-XX:+UseConcMarkSweepGC-XX:+UseParNewGC
-XX:CMSFullGCsBeforeCompacti
-XX:+UseCMSCompactAtFullColle
Eg:
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar
更多详细配置,请参考: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的物理内存。
Platform | Default VM | |||
Architecture | OS | client VM | if server-class, server VM; otherwise, client VM | server VM |
SPARC 32-bit | Solaris | X | ||
i586 | Solaris | X | ||
Linux | X | |||
Microsoft Windows | X | |||
SPARC 64-bit | Solaris | — | X | |
AMD64 | Linux | — | X | |
Microsoft Windows | — | X |
五、总结:
垃圾回收器目前分为四种类型, 串行,并行,并发标记,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
Java GC 垃圾回收器的类型小结