请告诉我在每次年轻代GC事件后,确定晋升到老年代的年轻代内存组成的最佳方法是什么?
理想情况下,我想知道哪些类名负责每个“年轻代->老年代”晋升块中堆的80%;
例如:我有600M年轻代,每个任期晋升6M;我想知道哪些对象组成了这6M。
谢谢。
理想情况下,我想知道哪些类名负责每个“年轻代->老年代”晋升块中堆的80%;
例如:我有600M年轻代,每个任期晋升6M;我想知道哪些对象组成了这6M。
谢谢。
这并不是一件容易的事情,但是我最近一直在分析大型Java应用程序的内存性能,并可以分享一些经验。
以下是我如何找到哪些对象被提升到老年代的方法:
首先,您需要确定哪些对象在“老/终身”空间中。这基本上是您标准的Java堆分析。对此,我建议使用jmap。它是sun jvm的一部分。
运行:
jmap -dump:file=heap.hprof PID
以获取堆转储。这将在转储期间暂停jvm(在2GB堆上大约为30秒)
现在,在Memory analyzer中加载.prof文件(这是最好的工具,毋庸置疑) 我会花一天时间玩Memory Analyzer来了解它,观看屏幕摄像头(需要登录,但值得)。
现在,您将知道哪些对象在您的堆中。
在 Memory analyser 的概览屏幕中,有一个名为“Unreachable objects histogram”的链接。现在这些对象都将在下一次 GC 期间被收集。但是有些可能在 eden 中,有些在 survivor 中,有些在 old 区中。