Parallel Scavenge收集器-GC日誌分析
阿新 • • 發佈:2018-12-12
1) jvm引數配置
預設使用的就是Parallel Scavenge收集器
也可以通過 -XX:+UseParallelGC 來配置
-Xms10m -Xmx10m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:NewRatio=2
2)程式碼
package com.roger.jvmparam; public class JvmParamMain { public static void main(String[] args) { byte[] b = null; for (int i = 0; i < 10; i++) { b = new byte[1 * 1024 * 1024]; } } }
3.控制檯列印
[GC (Allocation Failure) [PSYoungGen: 1930K->488K(2560K)] 8074K->6832K(9728K), 0.0023006 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC (Allocation Failure) --[PSYoungGen: 1512K->1512K(2560K)] 7856K->7856K(9728K), 0.0211116 secs] [Times: user=0.03 sys=0.00, real=0.02 secs] [Full GC (Ergonomics) [PSYoungGen: 1512K->0K(2560K)] [ParOldGen: 6344K->1655K(7168K)] 7856K->1655K(9728K), [Metaspace: 3462K->3462K(1056768K)], 0.0060138 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] Heap PSYoungGen total 2560K, used 1067K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000) eden space 2048K, 52% used [0x00000000ffd00000,0x00000000ffe0af48,0x00000000fff00000) from space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000) to space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000) ParOldGen total 7168K, used 3703K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000) object space 7168K, 51% used [0x00000000ff600000,0x00000000ff99dc80,0x00000000ffd00000) Metaspace used 3470K, capacity 4496K, committed 4864K, reserved 1056768K class space used 384K, capacity 388K, committed 512K, reserved 1048576K
4.概念
GC日誌引數 | 含義 |
---|---|
PSYoungGen | 新生代,這個名稱由收集器決定。PS是Parallel Scavenge收集器的縮寫 |
ParOldGen | Parallel Scavenge收集器配套的老年代 |
Metaspace | Parallel Scavenge收集器配套的永久代 |
total & used | 總的空間和用掉的空間 |
5.具體分析
GC (Allocation Failure)-GC型別表示Major GC
Full GC (Ergonomics) -GC型別表示Full GC
[PSYoungGen: 1946K->504K(2560K)]
[新生代:gc回收前該記憶體區域已使用容量->gc回收後該記憶體區域使用容量(該記憶體區域的總容量)]
也就說:新生代 gc回收前:該區域已使用1946k
gc回收後:該區域已使用504k
gc釋放了 1946 - 504 = 1442 k的空間
新生代的總大小為:2560k
[ParOldGen: 6344K->1680K(7168K)] ---老年代類比新生代
[Metaspace: 3486K->3486K(1056768K)] ---永久代類別新生代
8090K->6840K(9728K), 0.0019093 secs
gc前Java堆已使用容量->gc後Java堆已使用容量(Java堆的總容量-已分配), PSYoungGen回收gc耗時
也就是說 gc釋放了 8090 - 6040 = 2050k的空間
Java堆已分配的大小為 9728k
[Times: user=0.00 sys=0.00, real=0.00 secs]
[Times: 使用者消耗的cpu時間 核心態消耗的cpu時間, 操作從開始到結束所經過的牆鍾時間即實際消耗的時間]
也就是說 user+sys是cpu時間
cpu時間和牆鍾時間的差別是,牆鍾時間包括各種非運算的等待耗時,
例如等待磁碟I/O、等待執行緒阻塞,而cpu時間不包括這些耗時。
6.規律
[名稱:gc前記憶體佔用-> gc後記憶體佔用(該區記憶體總大小)]
7.-Xms10m -Xmx10m -XX:SurvivorRatio=2 -XX:NewRatio=2
初始堆大小為10M,堆可用最大為10m,from區: eden區 : = 1 : 2, 新生代:老年代 = 1 : 2
Heap
PSYoungGen total 2560K, used 1076K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
eden space 2048K, 52% used [0x00000000ffd00000,0x00000000ffe0d0b0,0x00000000fff00000)
from space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
to space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
ParOldGen total 7168K, used 3713K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
object space 7168K, 51% used [0x00000000ff600000,0x00000000ff9a04b0,0x00000000ffd00000)
新生代總大小:2048 + 512 + 512 = 3072k
老年代總大小:7168k
新生代 : 老年代 ≈ 1 : 2
這裡的from區和eden區不符合所設定的比例,是因為堆的大小關係,堆的空間大小太小了,
如果把堆的大小擴大 這個jvm引數-XX:SurvivorRatio才會起作用