Poison

GC Causes

在我的经历中,最常见的 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_GCGetPrimitiveArrayCritical, ReleasePrimitiveArrayCritical
  • G1 Evacuation Pause:参见 G1_Evacuation_Pause
  • G1 Humongous Allocation:参见 G1_Humongous_Allocation
Reference

gcCause.hpp
gcCause.cpp
Java 中 9 种常见的 CMS GC 问题分析与解决
GC Causes