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

时间:2019-01-16 01:47:45

标签: java jvm

enter image description here

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

2 个答案:

答案 0 :(得分:2)

您需要可以执行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附带的JVisualVM中找到它。 “分析器”>检查“设置”>“内存设置”>检查“记录分配堆栈跟踪”。开始分析,等待,等待,等待,确定最大的分配,右键单击“获取快照并显示分配堆栈跟踪”。看起来像YourKit does basically the same以及JProfiler(它们称为“分配记录”)。再说一次:大大降低了应用程序的速度,所以不要在产品中使用它。

答案 1 :(得分:0)

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

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

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

enter image description here

  1. 右键单击任何类名称,在弹出窗口中选择列出对象--->带有外向引用的

enter image description here

  1. 以上步骤列出了所选类的所有实例。右键单击任一类名,然后从弹出菜单中选择合并所有根的最短路径--->所有引用

enter image description here

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

enter image description here