触发Full GC的条件有哪些?
1 个回答
遇见错的人会消耗你,遇见对的人会治愈你。java小王子### 触发 Full GC 的条件 触发 Full GC(Full Garbage Collection)的条件主要有以下几种情况: #### 1. 调用 `System.gc()` 在代码中显式调用 `System.gc()` 方法,建议 JVM 进行垃圾回收。尽管这是一个建议,但 JVM 通常会触发 Full GC。 #### 2. 方法区空间不足 方法区存放的是类的信息、常量、静态变量等,当系统中要加载的类、反射的类和调用的方法较多时,方法区可能会被占满,从而触发 Full GC。 #### 3. 老年代空间不足 老年代空间不足可能由以下几种情况引起: ##### 3.1 Minor GC 后,老年代存放不下晋升对象 在进行 Minor GC 时,如果 Survivor Space 放不下存活的对象,这些对象会被晋升到老年代。如果老年代也放不下这些对象时,会触发 Full GC。此外,还有一些情况也会导致新生代对象晋升: - 存活对象经历的垃圾回收次数超过一定次数(通过 `-XX:MaxTenuringThreshold` 参数设置,默认为 15),会导致晋升。 - 在 Survivor 空间中,相同年龄所有对象大小的总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象会直接进入老年代,无须等到 `MaxTenuringThreshold` 中要求的年龄。 ##### 3.2 Concurrent Mode Failure 在执行 CMS GC(Concurrent Mark-Sweep Garbage Collection)过程中,如果有对象要放入老年代,而此时老年代空间不足,会导致 Concurrent Mode Failure,从而触发 Full GC。 ##### 3.3 历次晋升的对象平均大小大于老年代的剩余空间 为了避免新生代对象晋升到老年代导致老年代空间不足的现象,HotSpot 在进行 Minor GC 时,会判断之前统计得到的 Minor GC 晋升到老年代的平均大小是否大于老年代的剩余空间。如果是,则直接触发 Full GC。 ##### 3.4 老年代空间不足以为大对象分配内存 超过阀值(通过 `-XX:+PrintTenuringDistribution` 参数设置的大小)的大对象,会直接分配到老年代。如果老年代空间不足,则会触发 Full GC。 ### 总结 触发 Full GC 的主要条件包括: 1. **调用 `System.gc()`**:显式建议 JVM 进行垃圾回收。 2. **方法区空间不足**:加载的类信息、反射的类和调用的方法较多导致方法区被占满。 3. **老年代空间不足**:多种情况会导致老年代空间不足,如: - Minor GC 后晋升对象放不下。 - Concurrent Mode Failure。 - 晋升对象平均大小大于老年代剩余空间。 - 大对象直接分配到老年代,空间不足。 了解这些触发条件,有助于在实际开发和运维过程中,更好地优化和管理 JVM 的垃圾回收行为,提高系统的性能和稳定性。编辑于 2022-03-11 04:08 •IP属地 北京举报评论收藏
公众号进入网站体验更佳

