一、動手模擬YoungGC
以下是 :JDK 1.8版本
// JVM 參數運行
-XX:NewSize=5242880 -XX:MaxNewSize=5242880 -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=10485760 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log
-XX:InitialHeapSize
:初始堆大小,堆內存 10MB-XX:MaxHeapSize
:最大堆大小,5MB-XX:NewSize
: 初始新生代大小,5MB-XX:PretenureSizeThreshold=10485760
:指定了大對象閾值 10MB
新生代使用ParNew
垃圾回收器,老年代使用CMS
垃圾回收器
如圖:
-XX:+PrintGCDetails
: 打印詳細的gc日誌-XX:+PrintGCTimeStamps
: 打印每次GC發生的時間-Xloggc:gc.log
: 設置將gc日誌寫入一個磁盤文件
(1)示例代碼
public class Demo {
public static void main(String[] args) {
byte[] array1 = new byte[1024*1024];
array1 = new byte[1024*1024];
array1 = new byte[1024*1024];
array1 = null;
byte[] array2 = new byte[2 * 1024 * 1024];
}
}
代碼的意思:
new byte[1024*1024]
:連續創建3個數組,每個數組都是 1MBarray1
:這個局部變量依次引用這三個對象,最後把array1
這個局部變量指向null
(2)運行過程
byte[] array1 = new byte[1024*1024];
如圖:
array1 = new byte[1024*1024];
如圖:
array1 = new byte[1024*1024];
如圖:
array1 = null;
如圖:
byte[] array2 = new byte[2 * 1024 * 1024];
此時分配一個2MB大小的數組,嘗試放入 Eden
區中
然而Eden
總共 4MB,而且裏面已經放入 3MB (3個1MB的數組),所以只剩下 1MB 空間。
所以這時候會觸發 新生代 Young GC
(3)運行後,分析gc日誌
運行後,gc日誌如下:
OpenJDK 64-Bit Server VM (25.162-b12) for linux-amd64 JRE (1.8.0_162-8u162-b12-1-b12), built on Mar 15 2018 17:19:50 by "buildd" with gcc 7.3.0
Memory: 4k page, physical 16306976k(7355368k free), swap 2097148k(2097148k free)
CommandLine flags: -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 -XX:MaxNewSize=5242880 -XX:NewSize=5242880 -XX:OldPLABSize=16 -XX:PretenureSizeThreshold=10485760 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
0.116: [GC (Allocation Failure) 0.116: [ParNew: 3623K->413K(4608K), 0.0037366 secs] 3623K->1439K(9728K), 0.0038102 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
Heap
par new generation total 4608K, used 3603K [0x00000000ff600000, 0x00000000ffb00000, 0x00000000ffb00000)
eden space 4096K, 77% used [0x00000000ff600000, 0x00000000ff91d860, 0x00000000ffa00000)
from space 512K, 80% used [0x00000000ffa80000, 0x00000000ffae7560, 0x00000000ffb00000)
to space 512K, 0% used [0x00000000ffa00000, 0x00000000ffa00000, 0x00000000ffa80000)
concurrent mark-sweep generation total 5120K, used 1026K [0x00000000ffb00000, 0x0000000100000000, 0x0000000100000000)
Metaspace used 3197K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 343K, capacity 388K, committed 512K, reserved 1048576K
二、GC日誌說明
0.116: [GC (Allocation Failure) 0.116: [ParNew: 3623K->413K(4608K), 0.0037366 secs] 3623K->1439K(9728K), 0.0038102 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
這個概要說明了本次GC
的執行情況。
-
GC (Allocation Failure)
:對象分配失敗 -
0.116
: 系統運行以後過了多少秒發生了本次GC -
ParNew: 3623K->413K(4608K) 0.0037366 secs
:
- 新生代可用空間:4608KB == 4.5MB,一個
Eden
(4MB) + 一個Survivor
(0.5MB)- 3623K -> 413K: 新生代執行一次 GC,GC之前 3623KB,GC之後 413KB存活下來
- 0.0037366: 本次GC消耗的時間
3623K->1439K(9728K), 0.0038102 secs
:Java
堆內存的情況
- 9728KB(9.5MB): Java堆內存總可用空間
- 3623KB: GC之前 Java堆內存裏使用了 3623KB, 之後使用了 1439KB
(1)堆使用情況
Heap
par new generation total 4608K, used 3603K [0x00000000ff600000, 0x00000000ffb00000, 0x00000000ffb00000)
eden space 4096K, 77% used [0x00000000ff600000, 0x00000000ff91d860, 0x00000000ffa00000)
from space 512K, 80% used [0x00000000ffa80000, 0x00000000ffae7560, 0x00000000ffb00000)
to space 512K, 0% used [0x00000000ffa00000, 0x00000000ffa00000, 0x00000000ffa80000)
concurrent mark-sweep generation total 5120K, used 1026K [0x00000000ffb00000, 0x0000000100000000, 0x0000000100000000)
Metaspace used 3197K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 343K, capacity 388K, committed 512K, reserved 1048576K
par new generation total 4608K, used 3603K
ParNew
垃圾回收器負責的新生代,總共 4608KB(4.5MB), 目前使用了 3603KB
eden space 4096K, 77% used
:
Eden 4MB內存使用了 77%
from space 512K, 80%
:
From Survivor區,512KB,使用了 80%
concurrent mark-sweep generation total 5120K, used 1026K
:
Concurrent Mark-Sweep垃圾回收器(CMS垃圾回收器),管理的老年代內存空間一共是 5MB,此時使用了 1026KB
Metaspace used 3197K, capacity 4496K, committed 4864K, reserved 1056768K
元數據空間
- used, 使用了 3197KB
- capacity, 真實可使用的大小 4496KB
- committed, 向系統實際申請了大小 4864KB
- reserved,從系統中預定了 1056768KB
class space used 343K, capacity 388K, committed 512K, reserved 1048576K
class空間