【每天一道面试题】触发Full GC的场景有哪些?
1.调用System.gc()方法显示调用System.gc()方法,可能会触发Full GC。因为System.gc()方法只是建议Java虚拟机尽最大努力去回收所有不...
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,邀你加入技术交流群!
更多推荐
所有评论(0)