JVM學習--記憶體分配策略(持續更新)
阿新 • • 發佈:2019-01-05
一、前言
最近學習《深入java虛擬機器》,目前看到記憶體分配策略這塊。本文將進行一些實踐。
二、記憶體分配策略
1.大物件直接進入老年代
書中提到了:
下面進行測試,程式碼如下:
public class testBigSizeObject { private static final int _1MB=1024*1024; public static void main(String[] args) { byte[] allocation; allocation=new byte[4*_1MB]; //直接分配在老年代中 System.out.println(allocation[0]); } }
1.1 新生代收集器為Parallel Scavange的情形
以下虛擬機器引數,沒有顯式設定垃圾收集器,預設新生代為Parallel Scavange(這一點可以從標準輸出中的-XX:+UseParallelGC看出來)
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:PretenureSizeThreshold=3145728 -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+PrintCommandLineFlags
標準輸出:
-XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:MaxNewSize=10485760 -XX:NewSize=10485760 -XX:PretenureSizeThreshold=3145728 -XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Heap PSYoungGen total 9216K, used 5899K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000) eden space 8192K, 72% used [0x00000000ff600000,0x00000000ffbc2e10,0x00000000ffe00000) from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000) to space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000) ParOldGen total 10240K, used 0K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000) object space 10240K, 0% used [0x00000000fec00000,0x00000000fec00000,0x00000000ff600000) Metaspace used 2886K, capacity 4486K, committed 4864K, reserved 1056768K class space used 309K, capacity 386K, committed 512K, reserved 1048576K
這裡值得注意的是,大物件(程式碼中為4M的一個數組)大於-XX: PretenureSizeThreshold 設定的3M,應該直接進入老年代才對。
可是,這裡並沒有進入老年代。
1.2 顯式設定新生代垃圾收集器為Serial收集器
E:\javabase\out\production\javabase>java -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:PretenureSizeThreshold=3145728 -XX:+PrintGCDetails
-XX:SurvivorRatio=8 -XX:+UseSerialGC testBigSizeObject
輸出:
1.3 總結
看來,書裡說的策略,那也是在特定的垃圾收集器才生效的。不是在所有垃圾收集器中都有該現象。
所謂“紙上讀來終覺淺,絕知此事要躬行”。