如何用eclipse分析MAT

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

类加载器/组件org.apache.catalina.loader.WebappClassLoader @ 0x7a199fae8占用1,70,86,32,104(88.08%)个字节。

内存在加载的java.util.concurrent.ConcurrentHashMap$Segment[]一个实例中累积。

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

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

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

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

通常罪魁祸首不是你期望的那个:只是因为一个对象实例(在你的情况下是HashMap )积累了大量内存并不意味着这个对象的“所有者”是问题的根本原因。 您可能必须在对象树中查看上方或下方的某些级别,甚至是在完全不同的位置。 在大多数情况下,您非常了解自己的应用程序至关重要。

更新:您可以通过右键单击并选择Java CollectionsHash Entries来尝试检查HashMap的内容。 对于常规对象,您可以使用List对象使用传入引用 (列出引用所选对象的所有对象)或使用传出引用 (列出所选对象引用的所有对象)。


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

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