答案 0 :(得分:2)
您需要可以执行JVM allocation profiling的工具。
Java Flight Recorder(JFR)可以帮助您进行低开销的分配分析(1,2-旧版本的文档,现在的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占用更多内存以及从哪个线程创建等等。
如何查找从哪个线程创建特定对象?
java.lang.String