什么是垃圾回收器的触发条件?代码举例讲解

垃圾回收器的触发条件主要有两种:

  1. 内存使用达到一定比例:当堆内存使用率达到一定阈值时,垃圾回收器会自动启动进行垃圾回收。这个阈值我们可以通过JVM参数-XX:InitHeapOccupancyPercent和-XX:MaxHeapFreeRatio等进行设置。
  2. 堆内存不足:当系统内存不足以分配给对象时,就会启动垃圾回收来释放一些内存。这通常发生在代码中进行大量对象分配的时候。

JVM会根据系统环境选择默认的最优垃圾回收触发条件,我们也可以手动设置一些参数以调整触发频率和时间。常用的参数包括:

  • – -XX:InitHeapOccupancyPercent:初始化堆内存占用百分比。默认值为45%。
  • – -XX:MaxHeapFreeRatio:最大堆空闲百分比。默认值为70%。
  • – -XX:+UseAdaptiveSizePolicy:开启自适应时机调整策略。
  • – -XX:MinHeapFreeRatio:最小堆空闲百分比。默认值为40%。
  • – -Xms:初始堆内存大小。默认物理内存的1/64。
  • – -Xmx:最大堆内存大小。默认物理内存的1/4。

来看一个简单例子:

public class GCTriggerDemo {
    public static void main(String[] args) {
        byte[] data = new byte[1024 * 1024 * 10]; // 10MB

        System.out.println("第一阶段:");
        // 分配50MB对象
        byte[] data1 = new byte[1024 * 1024 * 50]; 

        System.out.println("第二阶段:");
        // 分配10MB对象
        byte[] data2 = new byte[1024 * 1024 * 10]; 
    }
}

执行该程序:

  1. 首先分配10MB内存,内存使用率未达触发条件,不会垃圾回收。
  2. 分配50MB大对象,内存使用加上已有的10MB超过JVM参数配置的阈值(比如60%),这时会自动触发垃圾回收。
  3. 垃圾回收完成后,又分配10MB对象,总内存达到70MB,这时内存不足以直接分配,也会触发第二次垃圾回收。

所以,理解垃圾回收器的触发条件,可以让我们更好的预测程序中的GC时机与频率。