什么场景触发fullGC

Full GC(Full Garbage Collection)是一种涉及整个 JVM 堆内存(包括年轻代、老年代以及永久代或元空间)的垃圾回收过程。由于 Full GC 清理的范围广泛,它通常会对应用程序的性能产生较大的影响,因此触发 Full GC 的场景需要谨慎处理。以下是触发 Full GC 的常见场景:

  1. 调用 System.gc() 方法: 开发人员或系统管理员可能会手动调用 System.gc() 方法来建议 JVM 执行 Full GC。然而,这并不意味着 JVM 必须立即执行 Full GC,因为垃圾回收器会根据当前的内存状况和策略来决定是否执行。

  2. 老年代空间不足: 当老年代的可用空间不足以存放新创建的大对象或 Minor GC 后晋升到老年代的对象时,会触发 Full GC。这是 Full GC 最常见的触发原因。

  3. 永久代(Permanent Generation)或元空间(Metaspace)空间不足: 永久代存储类的元数据信息,在 Java 8 之后被 Metaspace 替代。当永久代或 Metaspace 空间不足时,也可能触发 Full GC。不过,在 Java 8 及以后的版本中,Metaspace 的大小是弹性调整的,不一定会触发 Full GC。

  4. Promotion Failure: 当 Minor GC 发生时,如果 Survivor 区无法容纳存活的对象,这些对象将被晋升到老年代。如果此时老年代空间不足,将发生 Promotion Failure,从而触发 Full GC。

  5. Concurrent Mode Failure: 当使用并发标记清扫(CMS)垃圾回收器时,如果在并发清扫阶段无法完成,或者在并发清扫过程中发现老年代空间不足,将触发 Full GC。

  6. Handle Promotion Failure 设置: 即使在 Minor GC 后老年代空间足够存放晋升的对象,如果设置了 Handle Promotion Failure,且 Minor GC 后晋升到老年代的对象平均大小大于老年代剩余空间,也会触发 Full GC。

  7. 长时间未使用的对象在老年代积累过多: 如果老年代中积累了大量的长时间未使用的对象,JVM 可能会决定执行 Full GC 来释放这部分内存。

  8. JVM 内部策略: 根据 JVM 的内部策略和当前运行的垃圾回收器,还有可能有其他特定条件触发 Full GC。

posted @ 2024-07-01 01:15  使用D  阅读(11)  评论(0编辑  收藏  举报