0

我有一个长时间运行(多天)的应用程序,其中包含我希望在它们被垃圾收集之前保留不同时间长度的对象。假设有四个类别:

  1. 非常短暂(<1s)
  2. 在用户关注的持续时间内存活(1s < 18h)
  3. 每日数据(~24h)
  4. 'Eternal'(很少,应用程序的生命周期)

为了帮助进行调优,我想找到一种使用 Java 6 Hotspot VM 检查实际数据进入终身代的方法。使用 jmap 生成 HPROF 文件似乎不包含世代信息。有没有其他方法可以获取这些信息?

4

1 回答 1

0

不,没有简单的方法来获取单个对象的生成信息。实际上,如果您要求“活动”对象,这将触发 Full GC 并将所有对象放入老年代(所以现在您知道所有对象在哪里,但不知道它们在哪里)

在完整 GC 中幸存下来的对象很可能在老年代,因此如果您的系统每 5 分钟执行一次完整 GC,那么任何持续时间长于该时间的对象都差不多。

您可以做的最好的事情是尽量减少丢弃的对象(使用内存分析器来帮助)这将提高 GC 性能并减少它们发生的频率。在极端示例中,您可以使用堆外内存,这很难使用,但几乎不使用堆。如果您有很多 GB 的数据,尤其有用。

于 2012-08-15T14:45:04.320 回答