- 对象优先分配Eden与分配担保机制
public class Test {
private static final int _1MB = 1024 * 1024;
/**
* VM 参数: -Xms:20M -Xmx:20M -Xmn:10M
*/
public static void testAllocation(){
//分配 A 到 Eden 2Mb 剩余6Mb
byte[] A = new byte[2 * _1MB];
//分配 B 到 Eden 2Mb 剩余 4Mb
byte[] B = new byte[2 * _1MB];
//分配 C 到 Eden 2Mb 剩余2Mb
byte[] C = new byte[2 * _1MB];
//分配D对象到Eden 4Mb 发现Eden 剩余空间不足,触发Minor GC—>
// 发现A/B/C都存活 复制A/B/C到Survivor区->
// A/B/C都比Survivor大 触发分配担保机制->
//A/B/C 都进入Old区 Eden 清理内存 剩余 8Mb->
//D对象放入Eden区
byte[] D = new byte[4 * _1MB];
}
}
2. 大对象直接进入老年代
/**
* VM 参数: -Xms:20M -Xmx:20M -Xmn:10M -XX:PretenureSizeThreshold:3145728
*/
public static void testPretenureSizeThreshold(){
//分配 A 到 Eden 4Mb 超过设定阈值3Mb 触发大对象直接进入老年代机制->
//分配A 到 Old区
byte[] A = new byte[4 * _1MB];
}
3.对象年龄判定
/**
* VM 参数: -Xms:20M -Xmx:20M -Xmn:10M -XX:PretenureSizeThreshold:3145728
*/
public static void testPretenureSizeThreshold(){
//分配 A 到 Eden 0.25Mb
//分配A 到 Eden
byte[] A = new byte[1/4 * _1MB];
while (true){
byte[] B = new byte[1/4*_1MB];
B = null;
}
}
4.动态对象年龄判定
/**
* VM 参数: -Xms:20M -Xmx:20M -Xmn:10M -XX:MaxTenuringThreshold=15
*/
public static void testPretenureSizeThreshold(){
//分配 A 到 Eden 0.25Mb
byte[] A = new byte[1/4 * _1MB];
//分配B 到Eden 0.25Mb
byte[] B = new byte[1/4 * _1MB];
while (true){
byte[] C = new byte[1/4 * _1MB];
C = null;
}
}