繁体   English   中英

Java,我如何找出哪个类或方法使用大量内存?

[英]Java,How do I find out which class or method USES a lot of memory?

在此处输入图片说明

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

您需要一个可以进行JVM分配分析的工具。

Java的飞行记录器(JFR)可以帮助您以低开销分配分析( 12 -旧版本的文档,用户界面现在看起来完全不同,但“分配”和“TLAB”仍然用来寻找的东西的话)。 确保在您使用的设置中启用了分配配置文件。 在OpenJDK 11之前,这是一项商业功能。他们说,如今其他一些工具也可以以较低的开销做到这一点(例如async-profiler )。

如果您不关心应用程序变得异常缓慢并且运行在JDK <11(?)上,则VisualVM过去可以向您显示堆栈分配的痕迹。 我无法在最新版本(到目前为止为1.4.2)中找到它,但是可以在Oracle JDK 8附带的JVisualVM中找到它。 “分析器”>检查“设置”>“内存设置”>检查“记录分配堆栈跟踪”。 开始分析,等待,等待,等待,确定最大的分配,右键单击“获取快照并显示分配堆栈跟踪”。 看起来YourKit和JProfiler(它们称为“分配记录”) 基本相同 再次:大大降低了应用程序的速度,因此请不要在产品中使用它。

您会定期进行堆转储,并使用MAT- Memory Analyzer Tool( https://www.eclipse.org/mat/ )之类的工具进行分析。 该工具提供哪个对象/类占用更多内存以及从哪个线程创建等。

如何查找从哪个线程创建特定对象?

  1. 在MAT中,单击直方图-它会显示转储中可用的类的列表。 为了演示,让我仅过滤掉类java.lang.String

在此处输入图片说明

  1. 右键单击任何类名称,在弹出窗口中选择“ 列表对象--->具有传出引用”

在此处输入图片说明

  1. 步骤上方列出了所选类的所有实例。 右键单击任何一个类名,然后从弹出菜单中选择“将最短路径合并到GC根目录--->并包含所有引用”

在此处输入图片说明

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

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM