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