我的Web应用程序正在apache tomcat中运行。
类加载器/组件org.apache.catalina.loader.WebappClassLoader @ 0x7a199fae8
占用 1,70,86,32,104 (88.08%) 字节。
内存在<system class loader>
加载的一个实例中累积java.util.concurrent.ConcurrentHashMap$Segment[]
。
我在分析堆转储时遇到了这个问题。如何进一步分析?
你提供的信息很少,所以我只能提供很少的建议...... ;-)
首先,您需要找出谁在使用最大的对象(您的案例中是HashMap
)。尝试查看HashMap
的内容,以便您可以找到它的用途。您还应该尝试查看此对象的引用位置。
您可以尝试限制其大小。根据它是由您使用的框架还是您自己的代码使用,这可能很容易(例如框架缓存的配置更改),中等(例如,您需要重构自己的代码)或困难(例如,它深埋在您无法控制的库中)。
通常罪魁祸首不是您所期望的:仅仅因为对象实例(在您的情况下为HashMap
)积累了大量内存并不意味着该对象的"所有者"是问题的根本原因。您可能必须在对象树中查看上方或下方的某些级别,甚至在完全不同的位置查看。在大多数情况下,非常了解您的应用程序至关重要。
更新:您可以尝试检查HashMap
的内容,方法是右键单击它并选择Java 集合、哈希条目。对于常规对象,可以使用 List 对象、传入引用(列出引用所选对象的所有对象)或传出引用(列出所选对象引用的所有对象)。
记忆分析不是一件容易的事,可能需要很多时间,至少如果你不习惯的话......
如果您需要进一步的帮助,则需要提供有关您的应用程序、您使用的框架以及堆在 MAT 中的外观的更多详细信息。