深入理解JVM探讨的是JVM1.7, 许多东西在1.8中都已经不一样
比如书中的P91-P93对象优先在Eden分配。
及下面这段代码
public class JVM {
private static final int __1MB = 1024*1024;
public static void main(String[] args) {
// 10M young 10M old
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];
}
}
书中说分配 al4 的时候出现了一次 ==minor GC ==
但是在1.8中,没有发生GC而是直接分配到了Eden区 ,al4 被直接分配到了老年代
1.8的运行图如下
再看下面这段代码
public class JVM {
private static final int __1MB = 1024*1024;
public static void main(String[] args) {
// 10M young 10M old
byte[] a1,a2,a3,a4;
// 发生GC时按照分配顺序进入了老年代
a1 = new byte[2*__1MB];
// 分配在Eden区
a2 = new byte[2*__1MB];
// Eden满了a3直接进入老年代
a3 = new byte[4*__1MB];
// 分配到老年代满了 发生FullGC
a4 = new byte[6*__1MB];
}
}
运行结果如图
为了验证代码中
我们改al3 为 3MB
运行结果如下图
又图可见,发生了两次GC,一次FullGC
原因是 al1 和al2 在 jVM 尝试给al3分配时,eden区不够,直接让al1 和al2 晋升老年代 ,这是第一个GC
al3 分配在eden区,
在分配al4时,eden区还是不够,让al3进入 老年代不够,所以发生GC,和FullGC, 一次FullGC至少伴随一次GC
大小不完全对,内存空间比原来要大。