面试小札:什么情况下会频繁full GC

 

内存泄漏问题

当程序中存在内存泄漏时,会频繁触发Full GC。例如,对象被错误地保持引用,导致其无法被正常回收。像在一些使用缓存的场景中,如果缓存没有设置合理的过期策略或者大小限制,缓存中的对象会一直占用内存,随着对象的不断积累,老年代内存空间会逐渐被填满,从而频繁触发Full GC。

大对象直接进入老年代

如果有大量大对象(如大数组、大字符串等)被创建,并且这些大对象直接进入老年代(例如,通过参数设置 - XX:PretenureSizeThreshold,当对象大小超过这个阈值时,直接在老年代分配内存)。当老年代空间不足以容纳这些大对象时,就会频繁触发Full GC。

老年代空间分配担保机制

在新生代进行Minor GC时,如果Survivor空间不够,对象需要晋升到老年代。如果老年代的剩余空间不足以容纳这些晋升对象,并且担保机制(Handle Promotion Failure)判断需要进行Full GC来腾出空间,就会触发Full GC。这种情况可能在新生代对象晋升率过高时频繁发生。

系统负载过高

当系统负载突然增大,产生大量对象时,可能会导致年轻代的对象很快填满,进而快速晋升到老年代。如果老年代的垃圾回收速度跟不上对象晋升的速度,就会频繁触发Full GC。例如,在一个高并发的Web应用中,大量的用户请求导致大量的临时对象产生,这些对象的生命周期管理不当就容易引发频繁Full GC。

Metaspace(元空间)溢出

在Java 8之后,使用Metaspace代替永久代来存储类信息等元数据。如果应用程序不断地加载新的类(如动态代理、反射等大量使用的场景),并且Metaspace没有足够的空间,就会触发Full GC来尝试回收空间。如果Metaspace无法有效回收空间,Full GC就会频繁发生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值