请让我知道在每次年轻GC事件之后确定提升到老年代的年轻代内存组成的最佳方法是什么?

理想情况下,我想知道负责每个“young gen -> old gen”提升块中 80% 的堆的类名;

例子:我有600M年轻一代,每个任期晋升6M;我想知道这6M是由哪些对象组成的。

谢谢。

有帮助吗?

解决方案

没有简单的方法可以做到这一点,但是,我最近一直在分析大型java应用程序的内存性能,并且可以分享一些经验。

以下是我如何发现哪些对象被提升到旧代:

首先,您需要确定哪些对象位于“旧/终身”空间中。这基本上是标准的 java 堆分析。为此我推荐jmap。它是sun jvm的一部分。跑步:jmap -dump:file=heap.hprof PID 获得堆转储。这将在转储期间暂停 jvm(在 2GB 堆上大约 30 秒)

现在加载 .prof 文件 内存分析仪 (为此,最好的工具,放下)我会花一天的时间与内存分析仪进行理解,观看屏幕录制(需要登录,但值得)。

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

这是技巧:在内存分析器的概述屏幕中,有一个链接:“无法到达的对象直方图”。现在这些对象都将在下一次 GC 时被收集。但有些可能是在伊甸园,有些是幸存者,有些是旧的。

现在,获取一些具有内存分析功能的分析器,我更喜欢 yourKit。使用您的套件运行您的应用程序并记录对象分配。

运行它并记录对象创建。创建对象列表后,使用所有三个列表来了解正在发生的情况。做人类最擅长的事情,观察模式。

  • 创建了哪些对象并且可以访问哪些对象。(内存分析器)
  • 堆中无法访问的对象(内存分析器)
  • 运行期间创建的对象(Profiler)

另一种方法是 YourKit 世代观. 。您可以拍摄堆快照并比较快照之间哪些对象仍然处于活动状态。如果你使用这个 视觉GC 您可以确定对象必须存活多长时间才能升级到旧代,并以这些时间间隔拍摄快照以查看哪些对象仍然存活。

好吧,祝你好运。/JT

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top