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