Java GC:最大对象类(按大小)被提升了吗?

6
请告诉我在每次年轻代GC事件后,确定晋升到老年代的年轻代内存组成的最佳方法是什么?
理想情况下,我想知道哪些类名负责每个“年轻代->老年代”晋升块中堆的80%;
例如:我有600M年轻代,每个任期晋升6M;我想知道哪些对象组成了这6M。
谢谢。
1个回答

6

这并不是一件容易的事情,但是我最近一直在分析大型Java应用程序的内存性能,并可以分享一些经验。

以下是我如何找到哪些对象被提升到老年代的方法:

首先,您需要确定哪些对象在“老/终身”空间中。这基本上是您标准的Java堆分析。对此,我建议使用jmap。它是sun jvm的一部分。 运行: jmap -dump:file=heap.hprof PID 以获取堆转储。这将在转储期间暂停jvm(在2GB堆上大约为30秒)

现在,在Memory analyzer中加载.prof文件(这是最好的工具,毋庸置疑) 我会花一天时间玩Memory Analyzer来了解它,观看屏幕摄像头(需要登录,但值得)。

现在,您将知道哪些对象在您的堆中。

在 Memory analyser 的概览屏幕中,有一个名为“Unreachable objects histogram”的链接。现在这些对象都将在下一次 GC 期间被收集。但是有些可能在 eden 中,有些在 survivor 中,有些在 old 区中。
现在,获取一个具有内存分析功能的分析器,我更喜欢 yourKit。使用 yourkit 运行您的应用程序并记录对象分配。
运行它并记录对象创建。一旦您获得了创建对象列表,请使用所有三个列表来了解正在发生的情况。做人类最擅长的事情,寻找模式。
  • 已创建且可达的对象(Memory analyser)
  • 堆中不可达的对象(Memory analyser)
  • 运行时创建的对象(Profiler)
另一种方法是使用YourKit 代数视图。您可以对堆进行快照,并比较快照之间仍然存在的对象。如果您将其与visualgc一起使用,则可以确定对象必须存活多长时间才能晋升为旧代,并在这些间隔处拍摄快照以查看仍然存在的对象。
祝好运。 /JT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接