JDK版本:1.8
public class TestAllocation {
private static final int _1MB = 1024 * 1024;
public static voidtestAllocation() {
byte[] a1, a2, a3, a4;
// a1 = new byte[2 * _1MB];
// a2 = new byte[2 * _1MB];
// a3 = new byte[2 * _1MB];
a4 = new byte[4 * _1MB];
}
public static void main(String[] args) {
testAllocation();
}
}
一、vm参数(使用SerialGC):
-XX:+UseSerialGC -XX:+PrintGC -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
通过-Xmn10M将新生代(包括Eden区和一个Survivor区)和一个Survivor区设置为10M,
执行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/3669009a510dde655ce682d2b61a7287.png)
可以看出: 4M的对象直接分配在新生代
二、vm参数增加(PretenureSizeThreshold代表直接晋升到老年代的大小):
-XX:PretenureSizeThreshold=3145728
执行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/107fc82ca02f89cd73a6c0ec5049ac36.png)
三、修改代码
public class TestAllocation {
private static final int _1MB = 1024 * 1024;
public static voidtestAllocation() {
byte[] a1, a2, a3, a4;
a1 = new byte[2 * _1MB];
a2 = new byte[2 * _1MB];
a3 = new byte[2 * _1MB];
a4 = new byte[4 * _1MB];
}
public static void main(String[] args) {
testAllocation();
}
}
四、VM Options用ParNewGC:
-XX:+UseParNewGC -XX:+PrintGC -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
执行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/ee8220460553e4e9bc1802a575c5d427.png)
五、VM Options用默认的ParallelGC:
-XX:+UseParallelGC -Xms20M -Xmx20M -Xmn10M -XX:+PrintGC -XX:+PrintGCDetails -XX:SurvivorRatio=8
执行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/3ee0f2962bc8316caa0b04793b95dc34.png)
六、VmOptions用G1GC执行如下:
![](https://i-blog.csdnimg.cn/blog_migrate/18f8ee26daf57c5fafeaba9b78c2142e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7e8d6f4124436d28f9850b4b53e8c9f7.png)