Java GC:推广的顶级对象类(按大小)?

在每次年轻的GC活动结束后,请让我知道确定促进老一代年轻一代记忆构成的最佳方法是什么?

理想情况下,我想知道负责的class级名称,每个“年轻一代 – >老一代”推广块的80%的堆;

例如:我有600M年轻人,每个任期晋升6M; 我想知道哪些对象构成了这个6M。

谢谢。

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

以下是我如何找到被提升为旧代的对象:

首先,您需要确定“旧/终身”空间中的对象。 这基本上是你标准的java堆分析。 为此我建议使用jmap。 它是太阳jvm的一部分。 run: jmap -dump:file=heap.hprof PID获取堆转储。 这将在转储期间暂停jvm(在2GB堆上~~ 30秒)

现在在内存分析器中加载.prof文件(这是最好的工具,请放下)我会花一天时间玩Memory Analyzer来了解它,观看screencam(需要登录,但值得)。

现在您将了解堆中的对象。

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

现在,让一些具有内存分析function的分析器,我更喜欢你的Kit。 使用yourkit和记录对象分配运行您的应用程序。

运行它并记录对象创建。 获得创建的对象列表后,使用所有三个列表来获取正在进行的操作的图片。 做人类最擅长的事情,看模式。

  • 创建和可访问的对象。 (记忆分析仪)
  • 堆中无法访问的对象(内存分析器)
  • 运行期间创建的对象(Profiler)

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

好吧,祝你好运。 / JT