JVM1.8对象的分配

深入理解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
大小不完全对,内存空间比原来要大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值