1、 系统并发量比较大,频繁发生Young GC,但是每次发生Young GC之后存活对象比较多,而Survivor内存配置不合理,放不下Young GC的存活对象,导致Young GC之后存活对象直接存放在老年代,从而导致老年代内存不足触发Full GC。

解决方式:通过jstat观察GC情况,合理调整新生代内存以及Eden区Survivor区占比。

2、系统频繁创建的大对象直接分配到老年代,导致老年代内存不足触发Full GC。

解决方式:其实这种一般是代码编写不恰当导致的,比如有一些导出的功能,直接select * from xxx,全量导出,导致创建大对象,对于这种情况,一般都是优化代码。
具体步骤:
(1)通过jstat观察GC情况。
(2)通过jmap导出堆内存快照,然后在jvisualvm或者MAT进行分析。

3、系统发生了内存泄露,创建了大量对象,但是无法回收,导致Young GC之后达到15年岁年龄存放到老年代,久之老年代内存不足导致Full GC。

解决方式:通常也是代码编写不合理导致内存泄露,对于这种情况,一般都是优化代码。
具体步骤:
(1)通过jstat观察GC情况。
(2)通过jmap导出堆内存快照,然后在jvisualvm或者MAT进行分析。

4、元空间(永久代)加载太多类触发Full GC。

解决方式:一般都是自定义类加载器频繁加载外部类或者JVM动态代理导致的元空间内存不足触发Full GC,可以通过优化代码解决。

5、代码存在手动触发Full GC的代码,如System.gc()。

解决方式: 通过JVM配置关闭手动GC,-XX:+DisableExplicitGC。

打赏
支付宝 微信
上一篇 下一篇