6

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

理想情况下,我想知道负责的类名,例如,对于每个“年轻一代->老一代”提升块中 80% 的堆;

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

谢谢你。

4

1 回答 1

6

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

以下是我发现哪些对象被提升为老一代的方法:

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

现在在内存分析器中加载 .prof 文件(最好的工具,放下手)我会花一天时间玩内存分析器来理解它,观看屏幕摄像头(需要登录,但值得)。

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

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

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

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

  • 什么对象被创建并且是可访问的。(内存分析器)
  • 堆中无法访问的对象(内存分析器)
  • 运行期间创建的对象 (Profiler)

另一种方法是 YourKit世代视图。您可以拍摄堆快照并比较快照之间哪些对象仍然存在。如果将其与visualgc一起使用,您可以确定对象必须存活多长时间才能升级为旧代,并在这些间隔拍摄快照以查看哪些对象仍然存活。

好吧,祝你好运。/JT

于 2010-03-18T10:05:09.840 回答