内存泄漏 org.jboss.modules.ModuleClassLoader。内存在 java.util.concurrent.ConcurrentHashMap 的一个实例中累积(在 wildfly 上)

Memory leak org.jboss.modules.ModuleClassLoader. The memory is accumulated in one instance of java.util.concurrent.ConcurrentHashMap (on wildfly)

我正在升级 JBoss、java 和休眠版本

JBoss6转野蝇11

休眠 4 到休眠 5.1

和java 6至java 8

但是我在 java 堆上遇到了这个问题,79% 的内存被 ConcurrentHashMap 对象占用,我做了一个堆转储并使用 eclipse 分析器,我看到了主要错误来自这个错误

"The classloader/component "org.jboss.modules.ModuleClassLoader@0x6c27d1230”占用2.877.603.336(79,10%)字节。内存是在"system class loader"加载的"java.util.concurrent.ConcurrentHashMap$Node[]"的一个实例中累积的.

如果我看到细节,Dominator Tree 中的 Accumulated Objects 会显示:


org.jboss.modules.ModuleClassLoader -> 2.877.603.336 (Retained Heap)

-java.util.Vector @ 0x6c27d4db0 -> 2.877.123.872 (Retained Heap)

--java.lang.Object[20480] -> 2.877.123.840 (Retained Heap)

---class org.hibernate.internal.SessionFactoryRegistry -> 2.840.910.848 (Retained Heap)

-----org.hibernate.internal.SessionFactoryRegistry -> 2.840.910.168 (Retained Heap)

------java.util.concurrent.ConcurrentHashMap -> 2.840.909.848 (Retained Heap)

-------java.util.concurrent.ConcurrentHashMap$Node[256]-> 2.840.909.784 (Retained Heap)

我真的不明白为什么会出现这种情况,因为使用旧技术,没有一种会出现这种情况。

SessionFactoryRegistry 跟踪您的应用程序创建的 SessionFactory。通常您只需要一个 SessionFactory,创建一个的成本很高。 通常 SessionFactory 在启动时被初始化并且 Session 对象被自动注入。有多种方法可以实现,但您可以从 here

开始

最后是代码中的一个错误,每次我有一个 NOT_ACTIVE 状态时我都有一个 "reconnect",这个重新连接建立新的连接并在应用程序中产生内存泄漏.

删除此重新连接并排除 NOT_ACTIVE 状态是此问题的解决方案。