是什么触发了Java中的完整垃圾回收?

2022-09-01 21:25:22

我想知道在Java中触发完全垃圾回收的确切情况是什么。

显而易见的是:

  • 用完了老一代
  • 烫发耗尽
  • Calling System.gc()

其他导致完整gc的情况呢?特别:

  • 幸存者空间中没有足够的可用空间来复制伊甸园中的物体。
  • 次要集合无法应对新对象的分配率(尽管不知道如何操作)。

我正在运行 Sun Java 1.6,并在新一代中使用 Concurrent Mark-Sweep 和 ParNew。


答案 1

我观察到另一种情况,在Ubuntu上的Java Hotspot VM 1.6 64bit中使用并发标记扫描触发完整的GC:

如果 -XX:PermSize 值不等于 -XX:MaxPermSize(例如,它更小),当 java 需要扩展 PermGen 时,偶尔会发生 Full GC(即使它不需要分配比 MaxPermSize 更多的内存)。因此,将 -XX:PermSize 和 -XX:MaxPermSize 设置为相同似乎是一个好主意。


答案 2

这在很大程度上取决于您的 jvm 选项和您使用的 jvm。

出于这个原因,我建议你看看《Java Performance》一书,bý John and Hunt。


推荐