有需要可以查看我的完整思维导图链接:https://blog.csdn.net/qq_22701869/article/details/107525851
目录
配置虚拟机打印垃圾回收的日志-XX:+PrintGCDetails
1、模拟打印GC日志
使用System.gc();
代码如下
public class TestGC {
public static void main(String[] args) {
System.gc();
}
}
配置虚拟机打印垃圾回收的日志-XX:+PrintGCDetails
详细配置有两种方式,参考链接
2、日志分析
新生代Gc(Minor GC)
30.111:[ GC [ DefNew:3324K->152K(3712K),0.0025925secs]3324K->152K(11904K),
0.0031680secs]
老年代GC(Full Gc)
80.667:[ Full GC [Tenured:0K->210K(10240K),0.0149142secs]4603K->210K(19456K),
[Perm:2999K->2999K(21248K)],0.0150007secs]
[Times:user=0.01sys=0.00,real=0.02secs]
1、最前面的数字 30.111 和 80.667:代表了GC发生的时间,含义是从虚拟机启动以来经过的秒数
2、开头的 [GC 和 [Full GC 说明了停顿类型;如果是Full说明发生了Stop-The-World的,出现 [Full 一般是因为分配担保失败,如果是调用Sytem.gc(),就会显示 [Full GC(System) ,如下
[Full GC (System.gc()) [PSYoungGen: 824K->0K(114688K)]
[ParOldGen: 8K->766K(262144K)] 832K->766K(376832K),
[Metaspace: 3542K->3542K(1056768K)], 0.0054807 secs]
[Times: user=0.00 sys=0.00, real=0.01 secs]
3、[ DefNew、[Tenured、[Perm表示Gc发生的区域
[ DefNew:Default New Generation新生代,使用Serial收集器
[ ParNew:ParallelNew Generation新生代,使用ParNew收集器
[Tenured:老年代
[Perm:Permanent Generation 永久代
[PSYoungGen、新生代,使用Parallel Scavenge收集器
4、3324K->152K(3712K):GC前该内存区域已使用容量_>GC后该内存区域已使用容量(该内存区域总容量)
5、3324K->152K(11904K):GC前java堆已使用容量_>GC后java堆已使用容量(java堆总容量)
6、0.0025925secs]:表示该内存Gc所占用的时间,单位是秒
有的收集器回给出更加确定的数据,比如[Times: user=0.00 sys=0.00, real=0.01 secs] ,
user:用户态消耗的CPU时间
sys:内核态消耗的CPU时间
real:操作从开始到结束所经过的墙钟时间
备注:墙钟时间包括各种非运算的等待耗时,例如等待磁盘I/O,等待线程阻塞,而CPU时间不包括这些耗时,user+sys>real很正常