我们在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"方法
答案 0 :(得分:2)
不再需要这样的倾听者了。但是,在取消部署时关闭CacheManager
被认为是一种良好的举止。如果你是在ServletContextListener
中创建它,那么它就是一个好地方。
我不会在Ehcache上下载类加载器内存泄漏,但这并非不可能。
诊断它的正确方法是取消部署然后进行堆转储并查看(在像VisualVM这样的工具中)来自仍然存在的战争的包,然后找到它的类加载器,最后找到类加载器的GC根目录。您的泄漏将链接到GC根目录。