垃圾回收器的触发条件主要有两种:
- 内存使用达到一定比例:当堆内存使用率达到一定阈值时,垃圾回收器会自动启动进行垃圾回收。这个阈值我们可以通过JVM参数-XX:InitHeapOccupancyPercent和-XX:MaxHeapFreeRatio等进行设置。
- 堆内存不足:当系统内存不足以分配给对象时,就会启动垃圾回收来释放一些内存。这通常发生在代码中进行大量对象分配的时候。
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];
}
}
执行该程序:
- 首先分配10MB内存,内存使用率未达触发条件,不会垃圾回收。
- 分配50MB大对象,内存使用加上已有的10MB超过JVM参数配置的阈值(比如60%),这时会自动触发垃圾回收。
- 垃圾回收完成后,又分配10MB对象,总内存达到70MB,这时内存不足以直接分配,也会触发第二次垃圾回收。
所以,理解垃圾回收器的触发条件,可以让我们更好的预测程序中的GC时机与频率。