1. 程式人生 > >Parallel Scavenge收集器-GC日誌分析

Parallel Scavenge收集器-GC日誌分析

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才會起作用