java虚拟机8.GC日志与垃圾收集器参数

GC日志分析

每一种收集器的日志形式都是由它们自身的实现所决定,虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性。

0.097: [GC [PSYoungGen: 5396K->568K(75776K)] 5396K->568K(248320K), 0.0009988 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
0.098: [Full GC [PSYoungGen: 568K->0K(75776K)] [ParOldGen: 0K->468K(172544K)] 568K->468K(248320K) [PSPermGen: 2563K->2562K(21504K)], 0.0074459 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
  • 最前面的数字0.0970.098,代表GC发生的时间,这个数字的含义是Java虚拟机启动以来经过的秒数。
  • 开头[GC[Full GC说明这次垃圾收集的停顿类型,而不是用来区分新生代GC还是老年代GC。如果有“Full”,说明发生了Stop-The-World。例如在收集器ParNew在收集新生代时的日志中也可能出现[Full GC (一般由于分配担保失败之类的问题引起)。
  • 在后面的[PSYoungGen[ParOldGen[PSPermGen表示GC发生的区域,这里显示的区域名称与使用的GC收集器密切相关,例如这里使用的收集器为Parallel Scavenge,那它对应的新生代名称为PSYoungGen;如果使用的是Serial收集器,则新生代名称为DefNew;如果是ParNew收集器,则叫ParNew;同理对于老年代和永久代的名称。
  • 对于方括号内部的比如:5396K->568K(75776K),意思是“GC前该内存区域已使用容量 -> GC后该内存区域已使用容量(该内存区域总容量)”。
  • 对于方括号外部的:5396K->568K(248320K)568K->468K(248320K),表示“GC前Java堆已使用容量 -> GC后Java堆已使用容量(Java堆总容量)”。
  • 最后的:0.0009988 secs0.0074459 secs,表示该内存区域GC所占用的时间,单位秒。有的收集器会给出更具体的时间数据数据,如这里的[Times: user=0.00 sys=0.00, real=0.00 secs],里面的时间与Linux的time命令所输出的时间含义一致,分别代表用户消耗的CPU时间、内核消耗的CPU时间、操作从开始到结束所经过的墙钟时间。墙钟时间与CPU时间的区别是它包括各种非运算的等待耗时,如等待磁盘I/O、等待线程阻塞,而CPU时间不包括这些。但当系统有多CPU或者多核的话,多线程操作会叠加这些CPU时间,所以当看到user或sys时间超过real也是正常的。

GC参数总结 -XX:

  • UseSerialGC:Client模式下的默认值,使用Serial + Serial Old的收集器组合进行内存回收。
  • UseParNewGC:使用ParNew + Serial Old的收集器组合进行内存回收。
  • UseConcMarkSweepGC:使用ParNew + CMS + Serial Old的收集器组合进行内存回收,Serial Old作为CMS出现Concurrent Mode Failure失败后的后备收集器使用。
  • UseParallelGC:Server模式下的默认值,使用Parallel Scavenge + Serial Old的收集器组合进行内存回收。
  • UseParallelOldGC:使用Parallel Scavenge + Parallel Old的收集器组合进行内存回收。
  • SurvivorRatio:设置新生代中Eden与Survivor的比例,默认8。
  • PretenureSizeThreshold:设置直接进入老年代的对象大小。
  • MaxPretenureThreshold:设置晋升到老年代的对象年龄。
  • UseAdaptiveSizePolicy:是否动态调整Java堆中各个区域的大小以及进入老年代的年龄。
  • HandlePromotionFailure:是否允许分配担保失败,即老年代的剩余空间不足以应付新生代的整个Eden和Survivor区的所有对象都存活的极端情况。
  • ParallelGCThreads:设置并行GC时进行内存回收的线程数。
  • GCTimeRatio:仅在使用Parallel Scavenge收集器时生效,GC时间占总时间的比率,默认99,即允许1%的GC时间。
  • MAXGCPauseMillis:仅在使用Parallel Scavenge收集器时生效,设置GC最大停顿时间。
  • CMSInitiatingOccupancyFraction:仅在使用CMS收集器时生效,设置老年代空间被使用多少后触发垃圾收集,默认68%。
  • UseCMSCompactAtFullCollection:仅在使用CMS收集器时生效,完成垃圾收集后是否要进行一次内存碎片整理。
  • CMSFullGCsBeforeCompaction:仅在使用CMS收集器时生效,设置收集器在进行若干次垃圾收集后再启动一次内存碎片整理。

#笔记内容参考《深入理解java虚拟机》

猜你喜欢

转载自www.cnblogs.com/shanhm1991/p/9916166.html