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

Paw*_*ski 22 java performance garbage-collection

我想知道在Java中触发Full Garbage Collection的确切情况是什么.

显而易见的是:

  • 用完了老根
  • 耗尽烫发
  • 调用System.gc()

那些导致完整gc的其他病例呢?尤其:

  • Survivor Space中没有足够的可用空间来复制Eden中的对象.
  • 次要集合无法应对新对象的分配率(不知道如何).

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

Paw*_*ski 4

我观察到另一种情况会在 Ubuntu 上的 Java Hotspot VM 1.6 64 位中使用并发标记清除触发完整 GC:

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