请让我知道在每次年轻 GC 事件之后确定提升到老年代的年轻代内存组成的最佳方法是什么?
理想情况下,我想知道负责的类名,例如,对于每个“年轻一代->老一代”提升块中 80% 的堆;
例子:我有600M年轻一代,每个任期提升6M;我想知道这个 6M 是由哪些物体组成的。
谢谢你。
请让我知道在每次年轻 GC 事件之后确定提升到老年代的年轻代内存组成的最佳方法是什么?
理想情况下,我想知道负责的类名,例如,对于每个“年轻一代->老一代”提升块中 80% 的堆;
例子:我有600M年轻一代,每个任期提升6M;我想知道这个 6M 是由哪些物体组成的。
谢谢你。
没有简单的方法可以做到这一点,但是我最近一直在分析大型java应用程序的内存性能,并可以分享一些经验。
以下是我发现哪些对象被提升为老一代的方法:
首先,您需要确定“旧/永久”空间中的对象。这基本上是标准的 java 堆分析。为此,我推荐 jmap。它是 sun jvm 的一部分。运行:
jmap -dump:file=heap.hprof PID
获取堆转储。这将在转储期间暂停 jvm(在 2GB 堆上约 30 秒)
现在在内存分析器中加载 .prof 文件(最好的工具,放下手)我会花一天时间玩内存分析器来理解它,观看屏幕摄像头(需要登录,但值得)。
现在您将知道堆中有哪些对象。
这是诀窍:在内存分析器的概述屏幕中,有一个链接到:“无法访问的对象直方图”。现在这些对象都将在下一次 GC 期间收集。但有些可能在伊甸园,有些在幸存者中,有些在旧时代。
现在,获取一些具有内存分析功能的分析器,我更喜欢 yourKit。使用 yourkit 运行您的应用程序并记录对象分配。
运行它并记录对象的创建。一旦您创建了一个对象列表,请使用所有三个列表来了解正在发生的事情。做人类最擅长的事情,看模式。
另一种方法是 YourKit世代视图。您可以拍摄堆快照并比较快照之间哪些对象仍然存在。如果将其与visualgc一起使用,您可以确定对象必须存活多长时间才能升级为旧代,并在这些间隔拍摄快照以查看哪些对象仍然存活。
好吧,祝你好运。/JT