如何分析哪一代中的对象?

时间:2012-08-15 14:18:32

标签: java garbage-collection jvm-hotspot jmap

我有一个长时间运行(多天)的应用程序,我希望它们可以在垃圾收集之前保持不同的时间长度。让我们说有四个类别:

  1. 非常短暂(<1s)
  2. 活跃于用户注意的持续时间(1s <18h)
  3. 每日数据(约24小时)
  4. '永恒'(很少,申请的生命)
  5. 为了帮助调优,我想找到一种方法,使用Java 6 Hotspot VM检查实际数据进入终身代。使用jmap生成HPROF文件似乎不包含世代信息。是否有另一种获取此信息的方式?

1 个答案:

答案 0 :(得分:0)

不,没有简单的方法来获取单个对象的生成信息。事实上,如果你要求“实时”对象,这将触发一个完整的GC并将所有对象放入旧一代(所以现在你知道所有对象在哪里,但不知道它们在哪里)

在完整的GC中存活的对象很可能是老一代的,所以如果你的系统每5分钟完成一次完整的GC,那么任何持续时间都比这更长的东西都是一样的。

您可以做的最好的事情是最小化丢弃的对象(使用内存分析器来帮助)这将提高GC性能并减少它们发生的频率。在极端的例子中,您可以使用难以使用的off堆内存,但不使用堆旁边的堆内存。如果你有很多GB数据,esp很有用。