17

我看到我的应用程序大部分时间 PS 幸存者空间几乎已满 (98 %)。我不知道什么是 PS 幸存者空间。这是正常的吗?在这种情况下应该怎么做?

4

1 回答 1

16

首先,请参见此处:什么是幸存者空间?

通常,堆的 YoungGeneration 部分有 2 个幸存者空间(例如,对于 Hostpot VM)。它们的存在是为了让对象在升级到老一代之前成熟。因为清理老一代的成本更高。

收集一些统计数据以查看幸存者空间是否大部分时间都已满。您应该看到一个总是空的,而另一个正在填充。参见例如这个问题收集 GC 统计信息

获得数据后,查找:

  • 幸存者空间溢出- 当幸存者空间太小而无法让对象在 YoungHeap 集合之间成熟并且对象在没有时间成熟的情况下溢出到 OldGeneration(并且在被提升之前死亡)时,就会发生这种情况。

  • 此外,使用监控任期分布-XX:+PrintTenuringDistribution。看看对象成熟的速度有多快。

更新:阅读 热点内存管理白皮书并查看串行收集器部分,对幸存者空间有很好的解释:

注意:如果To空间已满,来自EdenFrom的未复制到它的活动对象将是tenured,无论它们存活了多少年轻代集合。根据定义,在复制活动对象后留在EdenFrom空间中的任何对象都不是活动的,并且不需要检查它们。

于 2013-01-21T19:10:13.180 回答