0

我们在 JBoss EAP 7 中遇到了元空间泄漏问题,每次热部署后都会发生这种泄漏。

经过一番搜索,我发现了这个: https ://blog.voina.org/docker-jboss-dies-with-java-lang-outofmemoryerror-metaspace-after-several-redeploys/

它实际上可能与保存一些类引用的 EHCache 有关,这会阻止 JBoss 类加载器从元空间中删除旧类。

在本文中,建议使用 EHCache 库中包含的侦听器:

net.sf.ehcache.constructs.web.ShutdownListener

不幸的是,我们使用的是 EHCache 3.2.0,并且在那个版本中没有这样的监听器,有没有其他监听器的替代品?或者任何与我可以在“contextDestroyed”方法中调用的完全相同的方法?

4

1 回答 1

2

不再需要这样的听众。但是,在取消部署时关闭您被认为是一种礼貌CacheManager。如果您在 a 中创建它,则在ServletContextListener那里销毁它似乎是一个好地方。

我不会因为类加载器内存泄漏而押注 Ehcache,但这并非不可能。

诊断它的正确方法是取消部署,然后进行堆转储并(在 VisualVM 之类的工具中)查找仍然存在的战争中的包,然后找到它的类加载器,最后找到类加载器的 GC 根。您的泄漏将在 GC 根的链中。

于 2017-11-05T03:16:19.667 回答