关于GC之六-一些命令
查看当前堆中对象信息
jmap - histo pid > map.all
jmap -histo:live pid > map.live
jstat -gcutil
jstat -gcutil -h 10 8894 1000
-h 每隔10行 打印一次头信息
8894: pid
1000: 1000毫秒,表示1秒
➜ ~ jstat -gcutil -h 10 8894 1000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 2.27 47.28 93.36 91.27 470 6.063 87 29.323 35.386
0.00 0.00 2.27 47.28 93.36 91.27 470 6.063 87 29.323 35.386
0.00 0.00 2.27 47.28 93.36 91.27 470 6.063 87 29.323 35.386
0.00 0.00 2.27 47.28 93.36 91.27 470 6.063 87 29.323 35.386
0.00 0.00 2.38 47.28 93.36 91.27 470 6.063 87 29.323 35.386
0.00 0.00 2.38 47.28 93.36 91.27 470 6.063 87 29.323 35.386
0.00 0.00 2.38 47.28 93.36 91.27 470 6.063 87 29.323 35.386
0.00 0.00 2.38 47.28 93.36 91.27 470 6.063 87 29.323 35.386
0.00 0.00 2.38 47.28 93.36 91.27 470 6.063 87 29.323 35.386
0.00 0.00 2.38 47.28 93.36 91.27 470 6.063 87 29.323 35.386
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 2.38 47.28 93.36 91.27 470 6.063 87 29.323 35.386
0.00 0.00 2.38 47.28 93.36 91.27 470 6.063 87 29.323 35.386
0.00 0.00 2.42 47.28 93.36 91.27 470 6.063 87 29.323 35.386
S0、S1 代表两个Survivor区;
E 代表 Eden 区;
O(Old)代表老年代;
P(Permanent)代表永久代;
YGC(Young GC)代表Minor GC;
YGCT代表Minor GC耗时;
FGC(Full GC)代表Full GC耗时;
GCT代表Minor & Full GC共计耗时。
CCS:压缩使用比例
M:元空间(MetaspaceSize)已使用的占当前容量百分比
Java 堆分为新生代和老年代,新生代一般划分为三块区域,Eden + From Survivor + To Survivor,Eden 和 Survivor 的内存比为8:1,每次只使用一个Eden 和一个 Survivor 区域,另一个 Survivor 用于复制收集算法回收内存。
对象一般尽量分配到新生代中,而对于大对象(长字符串和大数组)直接分配在老年代中,同时“年龄”长的的对象会从新生代自动晋升到老年代中。
Java 方法区称为永久代,只有 HotSpot 虚拟机才存在永久代。
当 Eden 区域分配不足时,自动发生一次 Minor GC。
当发生 Minor GC 时,虚拟机会自动检测(比较)新生代晋升到老年代的对象内存大小和老年代剩余内存大小,如果晋升>剩余,则发生一次Full GC;如果晋升<剩余,则去检测老年代的内存担保 HandlePromotionFailure 是否允许担保失败,如果不允许担保失败,则发生一次Full GC,如果允许失败,则进行一次Minor GC。
参考资料:https://www.ibm.com/developerworks/cn/java/j-lo-JVMGarbageCollection/