Survivor区放不下存活对象,那么存活对象直接就分配到老年代?

该博客探讨了JVM参数对内存分配的影响,通过示例代码展示了新生代与老年代的GC行为。在特定配置下,当Survivor区无法容纳所有存活对象时,部分对象会进入老年代。此外,文章还提到了不同大小对象的分配情况,并分析了GC日志以理解内存占用变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调整JVM参数如下:

-XX:NewSize=10485760—新生代大小为10m
-XX:MaxNewSize=10485760—新生代最大大小为10m
-Xms20M—初始堆大小为20m
-Xmx20M—最大堆大小为20m
-XX:+UseParNewGC:新生代使用ParNewGC垃圾回收器
-XX:+UseConcMarkSweepGC---老年代使用CMS
-XX:+PrintGCDetails---打印GC详细日志
-XX:+PrintGCTimeStamps—打印GC时间
-XX:SurvivorRatio=8—设置eden区和survivor区的比例为8:1:1
-XX:PretenureSizeThreshold=10485760—设置最大对象的阈值为10m

测试demo:

/**
 * Survivor区放不下存活对象,部分对象进入老年代
 */
public class demo {
    public static void main(String[] args) {
        byte[] bytes1 = new byte[1024 * 1024];//1m
        bytes1 = new byte[1024 * 1024];//1m
        bytes1 = new byte[1024 * 1024];//1m
        //直接分配一个5m的对象,由于eden区只有8m,之前已经分配了3m再加上一些未知对象也会占据一定的内存空间,此时必然会引起新生代gc
        byte[] bytes3 = new byte[5 * 1024 * 1024];//5m
    }
}

GC信息:在这里插入图片描述
以上信息关键关注红框部分,GC过后,此时from区大概被占据85%的内存,老年代中则大致有1026k的空间被占用。

修改下代码,再多分配一个128kb的对象,修改后demo1如下:

/**
 * Survivor区放不下存活对象,部分对象进入老年代
 */
public class demo1 {
    public static void main(String[] args) {
        byte[] bytes1 = new byte[1024 * 1024];//1m
        bytes1 = new byte[1024 * 1024];//1m
        bytes1 = new byte[1024 * 1024];//1m
        byte[] bytes0 = new byte[128 * 1024];//128kb
        //直接分配一个5m的对象,由于eden区只有8m,之前已经分配了3m再加上一些未知对象也会占据一定的内存空间,此时必然会引起新生代gc
        byte[] bytes3 = new byte[5 * 1024 * 1024];//5m
    }
}

GC信息:在这里插入图片描述
先对两个demo的代码进行对比,发现demo1只是比demo多新建了一个128k的对象,所以demo1代码GC后的存活对象会比demo代码GC后的存活对象多128k,接着对比下前后两个demo输出的GC信息,会发现老年代依旧还是被占据着1026k的内存空间,但是from区的内存被占用比例从85%升到了98%,这对比下来就很直观了,128k的对象去了哪里?肯定是from区,因为老年代被占用的内存大小根本没变。

总结

如果Survivor区放不下存活对象,存活对象并不是全都进入老年代,而是部分对象进入老年代,部分对象继续被分配到Survivor区。

PS:还有另一种情况,可参考本篇博文【如果发生oldGC,即使survivor区放的下部分存活对象,对象也会全部进入老年代】。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值