您需要一个可以执行 JVM 分配分析的工具。
Java Flight Recorder (JFR) 可以帮助您进行低开销分配分析(1、2 - 旧版本的文档,UI 现在看起来完全不同,但“分配”和“TLAB”仍然是用于找东西)。确保在您使用的设置中分配分析已启用。在 OpenJDK 11 之前,这是一个商业功能。他们说现在其他一些工具也可以以较低的开销实现这一点(例如 async-profiler)。
如果您不关心应用程序变得慢得无法使用并且使用 JDK < 11(?), VisualVM used to be able to show you stack traces of allocations. I can't find it in the latest version (1.4.2 as of now), but can find it in JVisualVM shipped with my Oracle JDK 8-something. "Profiler" >,请检查“设置”>“内存设置”> 检查“记录分配堆栈跟踪”。开始分析,等待,等待,等待,确定最大的分配,右键单击“拍摄快照并显示分配堆栈跟踪”。看起来 YourKit 基本上是一样的,还有 JProfiler(他们称之为“分配记录”)。再次强调:会大大减慢应用程序的速度,所以不要在产品中使用它。
您定期进行堆转储并使用 MAT-内存分析器工具 (https://www.eclipse.org/mat/) 等工具进行分析。该工具提供了哪个对象/类占用更多内存以及从哪个线程创建等。
如何查找特定对象是从哪个线程创建的?
java.lang.String