JVM-1. 七个垃圾收集器的终极对比

JVM-1. 七个垃圾收集器的终极对比

一、截止JDK8,七个Garbage Collector的比较

鉴于表格无法完整显示,贴一张图片以备参考:
图片如下:
这里写图片描述

原表格如下:

分代 No 名称 优点 缺点 开启参数 算法 使用场景 since version 备注
新生代 1 Serial 简单高效 stop the world -XX:+UseSerialGC 单线程、复制算法 内存较小的client模式下首选的新生代垃圾收集器 jdk1
新生代 2 ParNew 多cpu环境下,比Serial效果好 stop the world、cpu核数少时线程切换的开销使得没有serial性能好 ‘-XX:+UseParNewGC或’-XX:+UseConcMarkSweepGC 多线程并行、复制算法 server首选、jdk6之前,老年代用CMS,新生代只能用Serial或ParNew
新生代 3 Parallel Scavenge或称throughput收集器 高吞吐量、带有GC Ergonomics(gc自适应调节策略,使用-XX:+UseAdaptiveSizePolicy开启),无需手工指定新生代大小,survivor比例,晋升老年代对象的年龄等参数。 stop the world;不适合响应时间要求高的应用 ‘-XX:+UseParallelGC或-XX:+UseParallelOldGC 多线程、复制算法 关注高吞吐量并且响应性要求不高的应用 UseParallelGC时老年代为SerialOldGC,UseParallelOldGC时老年代为ParallelOldGC
老年代 4 Serial Old 简单高效 stop the world ‘-XX:+UseSerialGC或’-XX:+UseParNewGC 单线程、标记整理 client首选,搭配ParNew使用,或者在jdk6之前搭配Parallel Scavenge使用,也可在server模式下作为CMS的备胎(CMS可能会因为浮动垃圾而发生concurrent mode failure的错误,此时需要serial old上位)
老年代 5 Parallel Old 高吞吐量 stop the world,不适合响应时间要求高的应用 -XX:+UseParallelOldGC 多线程并行,标记整理 server模式默认选项。搭配Parallel Scavenge,关注吞吐量及cpu资源敏感的场合 jdk6 该选项自动设置 -XX:+UseParallelGC选项
老年代 6 CMS 停顿时间短,响应性高 对cpu资源非常敏感;无法处理浮动垃圾,可能会出现Concurrent mode failure;标记清除算法容易产生垃圾碎片 -XX:+UseConcMarkSweepGC 多线程并发,标记清除 要求高响应性的互联网站或BS服务端 jdk5 打开此开关参数后,使用ParNew+CMS+Serial Old收集器组
老年代 7 G1 当内存很大时,停顿时间高,并且吞吐量高 内存较小时性能没有CMS好 -XX:++UseG1GC 使用空间整合算法,堆被划分成多个连续的大小相等的region,新生代老年代物理上不再隔离,新生代老年代各自在内部也不再要求连续。 内存大于6G的高并发低停顿应用 jdk7 可能会在java9时作为默认GC

二、七个垃圾收集器的组合使用图

七大GC

三、调节新生代大小的三组参数

  1. 最高优先级: -XX:NewSize=1024m和-XX:MaxNewSize=1024m
  2. 次高优先级: -Xmn1024m
    (需要1.4以上,效果等同于:-XX:NewSize=-XX:MaxNewSize=1024m)
  3. 最低优先级: -XX:NewRatio=2
    注:NewRation指的是老年代:新生代之比。

四、备注

1. jvm选项中,-X选项是非标准的,不保证被所有VM实现支持,也可能在将来被改变;-XX选项是不稳定的,可能在将来被改变。

2. 使用-XX:+PrintFlagsFinal可以查看所有开启的VM选项

参考

《深入理解Java虚拟机 第2版》——周志明
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论