我看到我的应用程序大部分时间 PS 幸存者空间几乎已满 (98 %)。我不知道什么是 PS 幸存者空间。这是正常的吗?在这种情况下应该怎么做?
问问题
57341 次
1 回答
16
首先,请参见此处:什么是幸存者空间?
通常,堆的 YoungGeneration 部分有 2 个幸存者空间(例如,对于 Hostpot VM)。它们的存在是为了让对象在升级到老一代之前成熟。因为清理老一代的成本更高。
收集一些统计数据以查看幸存者空间是否大部分时间都已满。您应该看到一个总是空的,而另一个正在填充。参见例如这个问题收集 GC 统计信息。
获得数据后,查找:
幸存者空间溢出- 当幸存者空间太小而无法让对象在 YoungHeap 集合之间成熟并且对象在没有时间成熟的情况下溢出到 OldGeneration(并且在被提升之前死亡)时,就会发生这种情况。
此外,使用监控任期分布
-XX:+PrintTenuringDistribution
。看看对象成熟的速度有多快。
更新:阅读 热点内存管理白皮书并查看串行收集器部分,对幸存者空间有很好的解释:
注意:如果To空间已满,来自Eden或From的未复制到它的活动对象将是tenured,无论它们存活了多少年轻代集合。根据定义,在复制活动对象后留在Eden或From空间中的任何对象都不是活动的,并且不需要检查它们。
于 2013-01-21T19:10:13.180 回答