Java GC:提升的顶级对象类别(按大小)?
-
22-09-2019 - |
题
请让我知道在每次年轻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