jvm Java中,如何找出哪个类或方法占用了大量内存?

niwlg2el  于 4个月前  发布在  Java
关注(0)|答案(3)|浏览(98)


的数据
这是我的Java项目的一天内存曲线。我如何找出哪个类或方法使用了大量内存?

oyt4ldly

oyt4ldly1#

你需要一个可以做JVM allocation profiling的工具。
Java Flight Recorder(JFR)可以帮助您进行低开销分配分析(12-旧版本的文档,UI现在看起来很不一样,但“分配”和“TLAB”仍然是用来查找东西的单词).确保在您使用的设置中配置is enabled。这是OpenJDK 11之前的商业功能。他们说其他一些工具可以做到这一点。现在它的开销也很低(例如async-profiler)。
如果你不关心你的应用程序变得非常慢,并且使用JDK < 11(?),VisualVM以前可以显示分配的堆栈跟踪,我在最新版本中找不到(1.4.2截至目前),但是可以在我的Oracle JDK 8-something附带的JVisualVM中找到它。“Profiler”>检查“Settings”>“Memory Settings”>检查“Record allocation stack traces”.开始分析,等待,确定最大的分配,右键单击“拍摄快照并显示分配堆栈跟踪”。它看起来像YourKit does basically the same,以及JProfiler(他们称之为“分配记录”)。再次:减慢应用程序很多,所以不要在prod中使用它。

bcs8qyzn

bcs8qyzn2#

你需要定期进行堆转储,并使用MAT-内存分析工具(https://www.eclipse.org/mat/)等工具进行分析。该工具提供了哪个对象/类占用更多内存,以及它是从哪个线程创建的。
如何找到特定对象是从哪个线程创建的?
1.在MAT中,单击Histogram -它将显示转储中可用的类列表。
x1c 0d1x的数据
1.右键单击任意类名,在弹出窗口中选择列出对象->带输出引用



1.上面的步骤列出了所选类的所有示例。右键单击任何一个类名,然后从弹出窗口中选择Merge Shortest Paths to GC Roots-> with all references



1.完成上述步骤后,您可以查看创建特定对象的Thread类。


cwxwcias

cwxwcias3#

如果你只需要heap,你可以运行jmap -histo:live <YOUR PID>并解析(相当简洁的)输出。
ref

相关问题