一、为什么需要监控j垃极收集数据
因为它对应用的吞吐量和延迟有很大影响;
二、监控的手段:
可以将每次gc的数量直接输出到一个文本文件,对此文件进行分析;成本小
使用gui监控工具进行监控;成本高;
三、何时进行垃极收集
四、哪些数据需要进行垃极收集?
a.当前使用的垃极收集器
b.java堆的大小
c.新生代 和 老年代 的大小
d.永久代的大小
e.minor gc 的持续时间
f.minor gc的空间回收量
h.full gc的持续时间
j.full gc 的频率
k.每个并发垃极收集周期内的空间回收量
m.垃极收集前后java 堆的占用量
l.垃极收集前后新生代和老年代的占用量
x.垃极收集前后永久代的占用量
h.是否老年代或永久代的占用触发了full gc
m.应用是否显示调用的system.gc()
五、收集方式:
一般来说:垃极收集分为两种:次要垃极收集(也称新生代收集Minor Gc和主要垃极收集 Full Gc)。Minor Gc收集新生代,Full Gc通常会收集整个堆,包括新生代,新年代,和永久代,除了新生代中的活跃对象提升到老年代之外,还会压缩整理老年代和永久代,因些full Gc之后,新生代为空,老年代和永久代已压缩整理并且只有活跃对象。
a. 在jvm启动参数中:开启了:-XX:UseParallelGc或 XX:UseParallelOldGc时,如果关闭 -XX:-ScavengeBeforeFullGc,则虚拟机在FULL GC 之前不会进行Minor GC,如果开启 -XX:-ScavengeBeforeFullGc,则虚拟机每次在FULL GC前会做一次Minor Gc,分担一部分Full Gc要做的工作,在这两次独立的gc之间java线程有机会运行,从而缩短最大停顿时间,但也拉长了整体的停顿时间。
b.-verbose:gc常用的垃极收集信息常用命令,而 -XX:+PrintGCDetails可以打印更多有价值的垃极收集信息。
六.垃极日志的解读:
2016-09-20T12:11:13.849+0800: 8.114: [GC2016-09-20T12:11:13.849+0800: 8.114: [ParNew: 471871K->52416K(471872K), 0.3024470 secs] 502113K->172402K(996160K), 0.3025690 secs] [Times: user=0.52 sys=0.06, real=0.30 secs]
*如果使用的并发收集器CMS:-XX:+UseConcMarkSweepGC,它会自动开启-XX:UseParNewGC,即新生代使用多线程垃极收集器ParNew
[ParNew: 471871K->52416K(471872K), 0.3024470 secs] :是指新生代信息。ParNew表示配合CMS收集器在新生使用多线程垃极收集器ParNew,如要配合cms使用的是串行垃极收集器,这里的标签则为DefNew
→ 左边 471871K是垃极收集器前新生代的占用量,右边52416K是垃极收集后新生代占用量,即也是Survivor的占用量。括号中 471872K不是新生代占用量,还是新生代的大小,即eden和一块正被占用的survior的和。
0.3024470 sec是新生代回收不可达对象的时间。*
502113K->172402K(996160K), 0.3025690 secs] 是垃极收集前后堆的占用量(新生代和老年代的占用总量),和java堆的大小(新生代和老年代的总和),->左边502113K是堆在垃极回收之前的占用量,→右边172402K是垃极收集后java堆的占用量,括号中 996160K 是java堆的总量,0.3025690 sec是表示Minor Gc的时间,包括新生代垃极收集,提升对象到老年代以及最后剩余清扫工作。
[Times: user=0.52 sys=0.06, real=0.30 secs] 是CPU的使用时间,user是垃极收集执行非操作系统调用指令所消耗的cpu时间