Java GC 日志输出分析

搜到的几篇讲GC日志的文章,学到了很多东西。但是有些错误或者不够精确的地方。

因此自己尝试着总结一下。

先写个程序,然后结合程序解释每句话的意思。

运行参数 -Xms200M -Xmx200M -Xmn100M -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
默认的配置:client端,垃圾收集器是Parallel GC;JDK1.8没有永久代;SurvivorRatio = 8; import java.util.List; public class MyMain { public static void main(String args[]){ System.out.println("gcSystem"); MyRefObject a = new MyRefObject(); MyRefObject b = new MyRefObject();
a = null;
b = null; System.gc(); System.out.println("program end"); } } class MyRefObject{ public Object ref = null; private int buf[] = new int[2*1024*1024]; }
原始输出如下:
gcSystem
0.133: [GC (System.gc()) [PSYoungGen: 20992K->600K(89600K)] 20992K->608K(192000K), 0.0009786 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.134: [Full GC (System.gc()) [PSYoungGen: 600K->0K(89600K)] [ParOldGen: 8K->515K(102400K)] 608K->515K(192000K), [Metaspace: 2459K->2459K(1056768K)], 0.0057636 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
program end
Heap
 PSYoungGen      total 89600K, used 3840K [0x00000000f9c00000, 0x0000000100000000, 0x0000000100000000)
  eden space 76800K, 5% used [0x00000000f9c00000,0x00000000f9fc01f8,0x00000000fe700000)
  from space 12800K, 0% used [0x00000000fe700000,0x00000000fe700000,0x00000000ff380000)
  to   space 12800K, 0% used [0x00000000ff380000,0x00000000ff380000,0x0000000100000000)
 ParOldGen       total 102400K, used 515K [0x00000000f3800000, 0x00000000f9c00000, 0x00000000f9c00000)
  object space 102400K, 0% used [0x00000000f3800000,0x00000000f3880c10,0x00000000f9c00000)
 Metaspace       used 2468K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 272K, capacity 386K, committed 512K, reserved 1048576K


解析后的输出内容:红色{}内为我的解析
gcSystem
0.133{从jvm启动到当前的时间差}: [GC{本次GC是minor GC} (System.gc()){是由用户的函数调用触发} [PSYoungGen{GC收集器是parallel Scavenge}: 20992K{GC前新生代[eden+from]使用大小}->600K{执行后新生代[eden+from]使用大小}(89600K)}{新生代总共可用大小[eden+from的总大小=76800K+12800K],-Xmn100M表示新生代共100M,其中eden区80M,from和to各10M}] 20992K{GC前整个heap使用总大小}->608K{GC后heap使用总大小}(192000K{heap总可用大小[200M-to区的12800K]}), 0.0009786 secs{本次GC的时长}] [Times: user=0.00 sys=0.00, real=0.00 secs]
0.134: [Full GC (System.gc()) [PSYoungGen: 600K->0K{新生代使用被清零}(89600K{新生代可用内存大小,等于eden76800+from12800})] [ParOldGen{parallel old}: 8K{老年代}->515K(102400K)] 608K->515K(192000K), [Metaspace{JDK1.8由metaspace取代了perm space}: 2459K->2459K(1056768K)], 0.0057636 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
program end
Heap
 PSYoungGen      total 89600K{eden+from}, used 3840K{eden+from使用情况,但是from=0}[0x00000000f9c00000, 0x0000000100000000, 0x0000000100000000)
  eden space 76800K, 5% used{76800K*5% = used 3840K} [0x00000000f9c00000,0x00000000f9fc01f8,0x00000000fe700000)
  from space 12800K, 0% used [0x00000000fe700000,0x00000000fe700000,0x00000000ff380000)
  to   space 12800K, 0% used [0x00000000ff380000,0x00000000ff380000,0x0000000100000000)
 ParOldGen       total 102400K{-Xms200M -Xmx200M}, used 515K{515K为上面GC后老年代剩余的占用大小} [0x00000000f3800000, 0x00000000f9c00000, 0x00000000f9c00000)
  object space 102400K, 0% used [0x00000000f3800000,0x00000000f3880c10,0x00000000f9c00000)
 Metaspace       used 2468K, capacity 4486K, committed 4864K, reserved 1056768K{好大的reserved,没有永久代了,所以metaspace是剩余内存大小}
  class space    used 272K, capacity 386K, committed 512K, reserved 1048576K

 下图是整个的堆的分布情况

下面是一些特殊的说明。在我参考网站上的几个文章中,这几个部分说明有错误。

 

posted on 2016-11-23 15:46  忍hone  阅读(377)  评论(0编辑  收藏  举报

导航