【JVM】之 動手模擬 YoungGC

一、動手模擬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個數組,每個數組都是 1MB
  • array1:這個局部變量依次引用這三個對象,最後把array1這個局部變量指向null

(2)運行過程

  1. byte[] array1 = new byte[1024*1024];

如圖:

在這裏插入圖片描述

  1. array1 = new byte[1024*1024];

如圖:

在這裏插入圖片描述

  1. array1 = new byte[1024*1024];

如圖:

在這裏插入圖片描述

  1. array1 = null;

如圖:

在這裏插入圖片描述

  1. 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 secsJava堆內存的情況
  • 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空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章