垃圾收集器与内存分配策略之垃圾日志与常见参数

Posted PrivateO2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了垃圾收集器与内存分配策略之垃圾日志与常见参数相关的知识,希望对你有一定的参考价值。

垃圾收集器与内存分配策略(五)——垃圾日志与常见参数

理解GC日志

每个收集器的日志格式都可以不一样,但各个每个收集器的日志都维持一定的共性。如下面二段日志:

33.125: [GC [DefNew: 3324K->152K(3712K), 0.0025925 secs] 3324K->152K(11904K), 0.0031680 secs]  

100.667: [Full GC [Tenured: 0K->210K(10240K), 0.0149142 secs] 4603K->210K(19456K), [Perm : 2999K->2999K(21248K)], 0.0150007 secs] [Times: user=0.01 sys=0.00, real=0.02 secs]  
  1. 最前面的数字“33.125:”和“100.667:”代表了GC发生的时间,这个数字的含义是从Java虚拟机启动以来经过的秒数。
  2. GC和Full GC说明此次垃圾垃圾收集停顿的类型。如果有“Full”说明这次GC是发生了Stop-The-World的。如果是调用System.gc()方法触发的收集,那么这里将显示“[ Full GC(System) ]”
  3. 接下来的“[DefNew”、“[Tenured”、“[Perm”表示GC发生的区域,这里显示的区域名称与使用的GC收集器是密切相关的。
    (1).上面样例所使用的Serial收集器中的新生代名为“Default New Generation”,所以显示的是“[DefNew ]”。
    (2).如果是ParNew收集器,新生代名称就会变为“[ParNew”,意为“Parallel New Generation”。
    (3).如果采用Parallel Scavenge收集器,那它配套的新生代称为“PSYoungGen”,老年代和永久代同理,名称也是由收集器决定的。
  4. .后面方括号内部的“3324K->152K(3712K)”含义是“GC前该内存区域已使用容量-> GC后该内存区域已使用容量 (该内存区域总容量)”。
  5. 而在方括号之外的“3324K->152K(11904K)”表示“GC前Java堆已使用容量 -> GC后Java堆已使用容量 (Java堆总容量)”。
  6. 再往后,“0.0025925 secs”表示该内存区域GC所占用的时间,单位是秒。

下面这段新生代收集器ParNew的日志也会出现“[Full GC”(这一般是因为出现了分配担保失败之类的问题,所以才导致STW)。

[Full GC 283.736: [ParNew: 261599K->261599K(261952K), 0.0000288 secs] 

垃圾收集参数总结

-XX:+< option > 启用选项
-XX:-< option > 不启用选项
-XX:< option > = < number >
-XX:< option > = < string >

参数描述
-XX:+UseSerialGC Jvm运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收
-XX:+UseParNewGC 打开此开关后,使用ParNew + Serial Old的收集器进行垃圾回收
-XX:+UseConcMarkSweepGC 使用ParNew + CMS + Serial Old的收集器组合进行内存回收,Serial Old作为CMS出现“Concurrent Mode Failure”失败后的后备收集器使用。
-XX:+UseParallelGC Jvm运行在Server模式下的默认值,打开此开关后,使用Parallel Scavenge + Serial Old的收集器组合进行回收
-XX:+UseParallelOldGC 使用Parallel Scavenge + Parallel Old的收集器组合进行回收
-XX:SurvivorRatio 新生代中Eden区域与Survivor区域的容量比值,默认为8,代表Eden:Subrvivor = 8:1
-XX:PretenureSizeThreshold 直接晋升到老年代对象的大小,设置这个参数后,大于这个参数的对象将直接在老年代分配
-XX:MaxTenuringThreshold 晋升到老年代的对象年龄,每次Minor GC之后,年龄就加1,当超过这个参数的值时进入老年代
-XX:UseAdaptiveSizePolicy 动态调整java堆中各个区域的大小以及进入老年代的年龄
-XX:+HandlePromotionFailure 是否允许新生代收集担保,进行一次minor gc后, 另一块Survivor空间不足时,将直接会在老年代中保留
-XX:ParallelGCThreads 设置并行GC进行内存回收的线程数
-XX:GCTimeRatio GC时间占总时间的比列,默认值为99,即允许1%的GC时间,仅在使用Parallel Scavenge 收集器时有效
-XX:MaxGCPauseMillis 设置GC的最大停顿时间,在Parallel Scavenge 收集器下有效
-XX:CMSInitiatingOccupancyFraction 设置CMS收集器在老年代空间被使用多少后出发垃圾收集,默认值为68%,仅在CMS收集器时有效,-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSCompactAtFullCollection 由于CMS收集器会产生碎片,此参数设置在垃圾收集器后是否需要一次内存碎片整理过程,仅在CMS收集器时有效
-XX:+CMSFullGCBeforeCompaction 设置CMS收集器在进行若干次垃圾收集后再进行一次内存碎片整理过程,通常与UseCMSCompactAtFullCollection参数一起使用
-XX:+UseFastAccessorMethods 原始类型优化
-XX:+DisableExplicitGC 是否关闭手动System.gc
-XX:+CMSParallelRemarkEnabled 降低标记停顿
-XX:LargePageSizeInBytes 内存页的大小不可设置过大,会影响Perm的大小,-XX:LargePageSizeInBytes=128m

Client、Server模式默认GC

 新生代GC方式老年代和持久带GC方式
Client Serial串行GC Serial Old串行GC
Server Parallel Scavenge 并行回收GC Parallel Old 并行GC

Sun/Oracle JDK GC组合方式

 

enter description here

 

 

以上是关于垃圾收集器与内存分配策略之垃圾日志与常见参数的主要内容,如果未能解决你的问题,请参考以下文章

垃圾收集器与内存分配策略之内存分配与回收策略

JVM之GC日志分析与对象内存分配回收策略

垃圾收集器与内存分配策略之篇二:垃圾收集器

垃圾收集器与内存分配策略

垃圾收集器与内存分配策略之垃圾收集器

垃圾收集器与内存分配策略之垃圾收集算法