垃圾回收专题(一)--Full GC

1.什么是Full GC?

对新生代、老年代、永久代都进行GC,即Full GC。可以通过-XX:ScanengeBeforeFullGC来禁止Full GC时对新生代进行GC。

 

2.Full GC触发条件

①System.gc();可以使用-XX:_DisableExplicitGC禁止

②老年代空间不足(新生代对象转入、创建大对象、大数组)Full GC后仍然不足报OutOfMemoryError: Java heap space。

③永久代空间满(加载类、反射类、调用方法较多),Full GC后仍然不足报OutOfMemoryError: PermGen space。

④CMS GC时出现promotion failed(Young GC时From/To放不下,旧生代也放不下)和concurret mode failure(CMS GC同时有对象要放入旧生代,但空间不足)

⑤统计Young GC时要移到旧生代的对象大小,大于旧生代剩余空间

⑥RMI会1小时执行一次Full GC,可以用-Java -Dsun.rmi.dgc.client.gcInterval=3600000来设置间隔(可以使用-XX:_DisableExplicitGC禁止RMI调用System.gc())

 

扫描二维码关注公众号,回复: 198806 查看本文章

总之,引起Full GC的原因是new了很多对象,没有及时在主动释放掉,导致Eden内存不够用,因此需要不断把对象往老年代迁移导致老年代空间被占满了,因此必须Full GC。

 

3.如何预防Full GC:

①在缓存命中率不高的情况下,不使用缓存

②在不适用缓存的情况下,内存太小,或者设置参数有问题会引起Full GC。

 

 

猜你喜欢

转载自zhaodengfeng1989.iteye.com/blog/2414586