在我的经历中,最常见的 GC 触发原因为:
- System.gc(): 代码中显式触发
- Allocation Failure:最为常见的 GC 触发原因,主要发生在 Young 区,此时触发的为 Young GC
- Ergonomics:由收集器为了达到 吞吐量目标/最小暂时时间目标 动态伸缩堆引起,建议将最小堆大小与最大堆大小设置为相同的值,参见 Tuning Tips for Heap Sizes
- Metadata GC Threshold:由元数据区 commited 空间达到高水位线时触发,参见 Class Metadata
- GCLocker Initiated GC:因为 JNI 在关键区域调用时可能持有堆中的指针,所以在进行 JNI 关键区域调用时会暂时禁止 GC,直到所有线程退出 JNI 临界区时触发,参见 GCLocker_Initiated_GC 及 GetPrimitiveArrayCritical, ReleasePrimitiveArrayCritical
- G1 Evacuation Pause:参见 G1_Evacuation_Pause
- G1 Humongous Allocation:参见 G1_Humongous_Allocation