Bootstrap

JVM 在什么情况下会触发垃圾回收?

垃圾回收在JVM中自动进行,通常在以下几种情况下触发:

1. 年轻代满了(Young Generation Full)

当年轻代的Eden区满了时,会触发Minor GC(也称为Young GC)。这是因为新创建的对象首先分配在Eden区,当Eden区没有足够的空间来分配新对象时,就会进行Minor GC。

2. 年老代满了(Old Generation Full)

当年老代的空间不足以容纳新的对象时,会触发Major GC(也称为Full GC)。Major GC不仅回收年老代,还可能包括年轻代的回收。相比于Minor GC,Major GC的开销更大,会导致应用的停顿时间更长。

3. 元空间满了(Metaspace Full)

在Java 8之前,持久代(Permanent Generation)用于存储类的元数据,Java 8之后改为元空间(Metaspace)。当元空间满了时,也会触发Full GC。

4. 显式调用System.gc()

尽管不推荐在生产环境中使用,调用System.gc()方法会建议JVM进行垃圾回收。不过,具体是否回收以及何时回收由JVM决定。

5. 分配失败(Allocation Failure)

当JVM尝试分配内存而没有足够空间时,会触发GC。JVM会尝试通过GC回收未使用的内存来满足分配请求。如果回收后仍然没有足够的内存,可能会导致OutOfMemoryError异常。

6. G1垃圾回收器的混合回收(Mixed GC)

对于G1垃圾回收器,当年轻代和年老代的内存使用达到一定阈值时,会触发混合回收(Mixed GC),即回收年轻代和部分年老代的区域,以优化内存使用和应用停顿时间。

7. CMS的并发回收

对于CMS垃圾回收器,当老年代使用达到一定比例时,会触发并发标记和清理过程,以避免Full GC的长时间停顿。

总结

垃圾回收的触发主要是为了管理和优化内存使用,避免内存耗尽。JVM有多个参数和策略来调优GC行为,根据应用的具体需求,可以选择和配置合适的GC策略,以优化性能和响应时间。例如,调整堆内存大小、设置年轻代和年老代的比例、选择合适的垃圾回收器(如G1、CMS)等,都是常见的调优手段。

;