[英]Java,How do I find out which class or method USES a lot of memory?
您需要一个可以进行JVM分配分析的工具。
Java的飞行记录器(JFR)可以帮助您以低开销分配分析( 1 , 2 -旧版本的文档,用户界面现在看起来完全不同,但“分配”和“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/ )之类的工具进行分析。 该工具提供哪个对象/类占用更多内存以及从哪个线程创建等。
如何查找从哪个线程创建特定对象?
java.lang.String
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.