新创建对象直接触发fullGC问题

本文探讨了在Java中老年代内存使用不断增大的问题及其原因。解释了当ArrayList进行扩容时,由于对象晋升到老年代,导致常规的Young GC或CMS GC无法有效回收垃圾对象的情况。介绍了通过设置-XX:PretenureSizeThreshold参数让大对象直接在老年代分配的方法,并讨论了内存担保和小对象占据Survivor空间过多等问题。

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

今天在群里遇到个问题,这段程序,老年代占用会不断增大、直到fullgc

ArrayList扩容默认申请的对象在young分区,而其包含的对象晋升到老年代了,所以无论是young gc还是cms gc都不能一次完全把垃圾对象回收掉,只能full gc才能一次性全部gc掉
隔代引用的问题
虚拟机提供了一个-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代分配。这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制
如果不是太大或者太老(gc年龄),可以思考是不是1内存担保原因,或者是2GC时,同龄的小对象占据survivor半数以上空间
同龄alive小对象太多,gc时占据s区半数以上空间,也会被清到老年代

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值