如何用eclipse分析MAT

How to analyze MAT with eclipse

我的 Web 应用程序在 Apache tomcat 中是 运行。

classloader/componentorg.apache.catalina.loader.WebappClassLoader @ 0x7a199fae8占用1,70,86,32,104(88.08%)字节。

内存在<system class loader>加载的java.util.concurrent.ConcurrentHashMap$Segment[]实例中累积。

我在分析Heapdump的时候遇到了这个问题。如何进一步分析?

你提供的信息很少,所以我只能提供很少的建议……;-)

首先,您需要找出谁在使用最大的 object(在您的情况下是 HashMap)。尝试查看 HashMap 的内容,以便您了解它的用途。您还应该尝试查看引用此 object 的位置。

那么你可以尝试限制它的大小。根据它是被你使用的框架使用还是被你自己的代码使用,这可能很容易(例如框架缓存的配置更改),中等(例如你需要重构你自己的代码)或困难(例如它深埋在一个你无法控制的图书馆)。

通常罪魁祸首不是您所期望的:只是因为 object 实例(在您的情况下是 HashMap)积累了大量内存并不意味着 "owner"这 object 是问题的根本原因。您可能需要在 object 树中或什至在完全不同的位置查看上方或下方的某些级别。在大多数情况下,非常了解您的应用程序至关重要。

更新: 您可以尝试通过右键单击并选择 Java [=43] 来检查 HashMap 的内容=]哈希条目。对于一般 objects,您可以使用 List objectswith incoming references(列出所有 objects 引用所选 object) 或 与传出引用 (列出所有 object 被所选 object 引用)。


内存分析不是一件容易的事,可能需要很多时间,至少如果你不习惯的话……

如果您需要进一步的帮助,您需要提供有关您的应用程序、您使用的框架以及堆在 MAT 中的外观的更多详细信息。