我想知道在Java中触发Full Garbage Collection的确切情况是什么 .
显而易见的是:
用完了老一代
用完了烫发
调用System.gc()
那些导致完整gc的其他病例呢?尤其:
在Survivor Space中没有足够的可用空间来复制Eden中的对象 .
次要集合无法应对新对象的分配率(不知道如何) .
我正在运行Sun Java 1.6并使用Concurrent Mark-Sweep和ParNew用于新一代 .
我观察到另一种情况,使用Concurrent Mark-Sweep在Ubuntu上的Java Hotspot VM 1.6 64bit中触发完整的GC:
如果-XX:PermSize值不等于-XX:MaxPermSize(例如较小),则当java需要扩展PermGen时会发生偶尔的Full GC(即使它不需要分配比MaxPermSize更多的内存) . 所以将-XX:PermSize和-XX:MaxPermSize设置为相同似乎是一个好主意 .
这在很大程度上取决于你的jvm选项和你使用的jvm .
出于这个原因,我建议你看看“Java性能”这本书,约翰和亨特 .
2 回答
我观察到另一种情况,使用Concurrent Mark-Sweep在Ubuntu上的Java Hotspot VM 1.6 64bit中触发完整的GC:
如果-XX:PermSize值不等于-XX:MaxPermSize(例如较小),则当java需要扩展PermGen时会发生偶尔的Full GC(即使它不需要分配比MaxPermSize更多的内存) . 所以将-XX:PermSize和-XX:MaxPermSize设置为相同似乎是一个好主意 .
这在很大程度上取决于你的jvm选项和你使用的jvm .
出于这个原因,我建议你看看“Java性能”这本书,约翰和亨特 .