JVM(五)垃圾收集器_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > JVM(五)垃圾收集器

JVM(五)垃圾收集器

 2017/6/18 5:30:28  chou_qi  程序员俱乐部  我要评论(0)
  • 摘要:一、七种垃圾收集器(1)Serial(串行GC)-XX:+UseSerialGC(2)ParNew(并行GC)-XX:+UseParNewGC(3)ParallelScavenge(并行回收GC)(4)SerialOld(MSC)(串行GC)-XX:+UseSerialGC(5)CMS(并发GC)-XX:+UseConcMarkSweepGC(6)ParallelOld(并行GC)-XX:+UseParallelOldGC(7)G1(JDK1.7update14才可以正式商用)二
  • 标签:JVM

一、七种垃圾收集器

(1) Serial(串行GC)-XX:+UseSerialGC

(2) ParNew(并行GC)-XX:+UseParNewGC

(3) Parallel Scavenge(并行回收GC)

(4) Serial Old(MSC)(串行GC)-XX:+UseSerialGC

(5) CMS(并发GC)-XX:+UseConcMarkSweepGC

(6) Parallel Old(并行GC)-XX:+UseParallelOldGC

(7) G1(JDK1.7update14才可以正式商用)



?

二.1~3用于年轻代垃圾回收:年轻代的垃圾回收称为minor GC

三.4~6用于年老代垃圾回收(当然也可以用于方法区的回收):年老代的垃圾回收称为full GC

?

G1独立完成"分代垃圾回收"

注意:并行与并发

并行:多条垃圾回收线程同时操作

并发:垃圾回收线程与用户线程一起操作

?

?

四、常用五种组合

Serial/Serial Old

ParNew/Serial Old:与上边相比,只是比年轻代多了多线程垃圾回收而已

ParNew/CMS:当下比较高效的组合

Parallel Scavenge/Parallel Old:自动管理的组合

G1:最先进的收集器,但是需要JDK1.7update14以上

?

?

五. Serial/Serial Old

年轻代Serial收集器采用单个GC线程实现"复制"算法(包括扫描、复制)

年老代Serial Old收集器采用单个GC线程实现"标记-整理"算法

Serial与Serial Old都会暂停所有用户线程(即STW)

说明:

STW(stop the world):编译代码时为每一个方法注入safepoint(方法中循环结束的点、方法执行结束的点),在暂停应用时,需要等待所有的用户线程进入safepoint,之后暂停所有线程,然后进行垃圾回收。

适用场合:

CPU核数<2,物理内存<2G的机器(简单来讲,单CPU,新生代空间较小且对STW时间要求不高的情况下使用)

-XX:UseSerialGC:强制使用该GC组合

-XX:PrintGCApplicationStoppedTime:查看STW时间

?

六.ParNew/Serial Old:

ParNew除了采用多GC线程来实现复制算法以外,其他都与Serial一样,但是此组合中的Serial Old又是一个单GC线程,所以该组合是一个比较尴尬的组合,在单CPU情况下没有Serial/Serial Old速度快(因为ParNew多线程需要切换),在多CPU情况下又没有之后的三种组合快(因为Serial Old是单GC线程),所以使用其实不多。

-XX:ParallelGCThreads:指定ParNew GC线程的数量,默认与CPU核数相同,该参数在于CMS GC组合时,也可能会用到

?

七.Parallel Scavenge/Parallel Old:

?

特点:

年轻代Parallel Scavenge收集器采用多个GC线程实现"复制"算法(包括扫描、复制)

年老代Parallel Old收集器采用多个GC线程实现"标记-整理"算法

Parallel Scavenge与Parallel Old都会暂停所有用户线程(即STW)

说明:

吞吐量:CPU运行代码时间/(CPU运行代码时间+GC时间)

CMS主要注重STW的缩短(该时间越短,用户体验越好,所以主要用于处理很多的交互任务的情况)

Parallel Scavenge/Parallel Old主要注重吞吐量(吞吐量越大,说明CPU利用率越高,所以主要用于处理很多的CPU计算任务而用户交互任务较少的情况)

参数设置:

-XX:+UseParallelOldGC:使用该GC组合

-XX:GCTimeRatio:直接设置吞吐量大小,假设设为19,则允许的最大GC时间占总时间的1/(1+19),默认值为99,即1/(1+99)

-XX:MaxGCPauseMillis:最大GC停顿时间,该参数并非越小越好

-XX:+UseAdaptiveSizePolicy:开启该参数,-Xmn/-XX:SurvivorRatio/-XX:PretenureSizeThreshold这些参数就不起作用了,虚拟机会自动收集监控信息,动态调整这些参数以提供最合适的的停顿时间或者最大的吞吐量(GC自适应调节策略),而我们需要设置的就是-Xmx,-XX:+UseParallelOldGC或-XX:GCTimeRatio两个参数就好(当然-Xms也指定上与-Xmx相同就好)

注意:

-XX:GCTimeRatio和-XX:MaxGCPauseMillis设置一个就好

不开启-XX:+UseAdaptiveSizePolicy,-Xmn/-XX:SurvivorRatio/-XX:PretenureSizeThreshold这些参数依旧可以配置,以resin服务器为例

?

<jvm-arg>-Xms2048m</jvm-arg> <jvm-arg>-Xmx2048m</jvm-arg> <jvm-arg>-Xmn512m</jvm-arg> <jvm-arg>-Xss1m</jvm-arg> <jvm-arg>-XX:PermSize=256M</jvm-arg> <jvm-arg>-XX:MaxPermSize=256M</jvm-arg> <jvm-arg>-XX:SurvivorRatio=8</jvm-arg> <jvm-arg>-XX:MaxTenuringThreshold=15</jvm-arg> <jvm-arg>-XX:+UseParallelOldGC</jvm-arg> <jvm-arg>-XX:GCTimeRatio=19</jvm-arg> <jvm-arg>-XX:+PrintGCDetails</jvm-arg> <jvm-arg>-XX:+PrintGCTimeStamps</jvm-arg> View Code

适用场合:

很多的CPU计算任务而用户交互任务较少的情况

不想自己去过多的关注GC参数,想让虚拟机自己进行调优工作

?

八、调优方法

?

  8.1 新对象预留新生代

?

    由于fullGC(老年代)的成本远比minorGC(新生代和老年代)的成本大,所以给应用分配一个合理的新生代空间,尽量将对象分配到新生代减小fullGC的频率

?

  8.2 大对象进入老年代

?

    将大对象直接分配到老年代,保持新生代对象的结构的完整性,以提高GC效率, 可以通过-XX:PretenureSizeThreshold设置进入老年代的阀值

?

  8.3 稳定与震荡的堆大小

?

    稳定的对大小是对垃圾回收有利的,方法将-Xms和-Xmx的大小一致

?

  8.4 吞吐量优先

?

    尽可能减少系统执行垃圾回收的总时间,故采用并行垃圾回收器

?

    -XX:+UseParallelGC或使用-XX:+UseParallelOldGC

?

  8.5 降低停顿

?

    使用CMS回收器,同时减少fullGC的次数

?

九、获取gc信息的方法

?

  9.1 -verbose:gc或者-XX:+PrintGC  获取gc信息

?

  9.2 -XX:+PrintGCDetails  获取更加详细的gc信息

?

  9.3 -XX:+PrintGCTimeStamps  获取GC的频率和间隔

?

  9.4 -XX:+PrintHeapAtGC  获取堆的使用情况

?

  9.5 -Xloggc:D:\gc.log  指定日志情况的保存路径

?

10、jvm调优实战-tomcat启动加速

?

  在tomcat的bin/catalina.bat文件的开头添加相关的配置

?

  • class='magplus' title='点击查看原始大小图片' />
  • 大小: 20.9 KB
  • 查看图片附件
上一篇: storm worker异常重启原因排查汇总 下一篇: 没有下一篇了!
发表评论
用户名: 匿名