【发布时间】:2013-01-04 08:42:21
【问题描述】:
我看到 PS 幸存者空间几乎已满 (98 %) 用于我的应用程序的大部分时间。我不知道什么是 PS 幸存者空间。这是正常的吗? 在这种情况下应该怎么做?
【问题讨论】:
标签: memory-leaks garbage-collection jvm
我看到 PS 幸存者空间几乎已满 (98 %) 用于我的应用程序的大部分时间。我不知道什么是 PS 幸存者空间。这是正常的吗? 在这种情况下应该怎么做?
【问题讨论】:
标签: memory-leaks garbage-collection jvm
首先,参见例如这里:What is a survivor space?
通常,堆的 YoungGeneration 部分有 2 个幸存者空间(例如,对于 Hostpot VM)。它们的存在是为了让对象在将它们提升到老一代之前成熟。因为清理老年代的成本更高。
收集一些统计数据,看看大部分时间幸存者空间是否真的满了。您应该看到一个总是空的,而另一个正在填充。参见例如collecting GC stats的这个问题。
获得数据后,查找:
幸存者空间溢出 - 当幸存者空间太小而无法让对象在 YoungHeap 集合之间成熟并且对象在没有时间成熟的情况下溢出到 OldGeneration(并且升职前死)。
另外,使用-XX:+PrintTenuringDistribution 监控任期分布。看看对象成熟的速度有多快。
更新:阅读Hotspot Memory Management Whitepaper并查看串行收集器部分,对幸存者空间有很好的解释:
注意:如果 To 空间已满,则来自 Eden 或 From 的未激活对象 复制到它的是tenured,无论它们存活了多少年轻代集合。任何 根据定义,在活动对象被复制后留在 Eden 或 From 空间中的对象是不活动的,不需要检查它们。
【讨论】: