【每天一道面试题】触发Full GC的场景有哪些?

1.调用System.gc()方法

显示调用System.gc()方法,可能会触发Full GC。因为System.gc()方法只是建议Java虚拟机尽最大努力去回收所有不可用的对象,不一定立刻执行垃圾回收,如果进行垃圾回收,则会触发Full GC。

2.老年代空间不足

需要大量连续存储空间的对象会直接分配到老年代、长期存活的对象晋升到老年代,老年代空间不足以存放这些对象的时候会触发Full GC。

3.PermGen或Metaspace空间不足

在JDK8之前的版本中,PermGen(永久代)是HotSpot虚拟机中方法区的一种实现,它用于存放类的信息、常量、静态变量等数据,当系统中要加载的类、反射的类等较多时,永久代出现空间不足,在未配置为采用CMS GC的情况下会触发Full GC。

在JDK8中移除了永久代,改用了Metaspace,它也是方法区的一种实现,不过它与永久代最大的区别是Metaspace并不在虚拟机中,而是使用本地内存。当Metaspace空间不足进行回收时,需同时满足如下三个条件的类才会被卸载:该类所有的实例都已经被回收、加载该类的ClassLoader已经被回收、该类对应的java.lang.Class对象没有任何地方被引用,进而触发Full GC。

4.Minor GC晋升到老年代的平均大小大于老年代的剩余空间

在发生Minor GC前,会检查老年代是否有足够的连续空间,如果当前老年代最大可用连续空间小于平均历次晋升到老年代大小,则触发Full GC。

5.Cocurrent mode failure

在执行CMS GC的过程中,如果此时有线程将对象放入老年代,并且老年代空间不足,或者在做Minor GC的时候,新生代Survivor空间不足,需要放入老年代,而老年代空间也不足,则触发Full GC。

加微信wind7rui,邀你加入技术交流群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值