Java EHCache 3 侦听器和元空间问题
Java EHCache 3 listener and metaspace issue
我们在 JBoss EAP 7 中遇到元空间泄漏问题,并且每次热部署后都会发生此泄漏。
经过一番搜索,我发现了这个:
https://blog.voina.org/docker-jboss-dies-with-java-lang-outofmemoryerror-metaspace-after-several-redeploys/
它实际上可能与保存一些 class 引用的 EHCache 有关,这会阻止 JBoss classloader 从元空间中删除旧的 classes。
本文建议使用EHCache库中的监听器:
net.sf.ehcache.constructs.web.ShutdownListener
不幸的是,我们使用的是 EHCache 3.2.0,该版本中没有这样的监听器,是否有替代该监听器的方法?或者任何与我可以在 "contextDestroyed" 方法中调用的方法完全相同的方法?
不再需要这样的侦听器。但是,在取消部署时关闭你 CacheManager
被认为是礼貌。如果您在 ServletContextListener
中创建它,那么在那里销毁它似乎是个好地方。
我不认为 Ehcache 会导致类加载器内存泄漏,但这并非不可能。
诊断它的正确方法是取消部署,然后进行堆转储并查找(在像 VisualVM 这样的工具中)来自 war 的包仍然存在,然后找到它的类加载器,最后类加载器的 GC 根。您的泄漏将位于 GC 根目录中。
我们在 JBoss EAP 7 中遇到元空间泄漏问题,并且每次热部署后都会发生此泄漏。
经过一番搜索,我发现了这个: https://blog.voina.org/docker-jboss-dies-with-java-lang-outofmemoryerror-metaspace-after-several-redeploys/
它实际上可能与保存一些 class 引用的 EHCache 有关,这会阻止 JBoss classloader 从元空间中删除旧的 classes。
本文建议使用EHCache库中的监听器:
net.sf.ehcache.constructs.web.ShutdownListener
不幸的是,我们使用的是 EHCache 3.2.0,该版本中没有这样的监听器,是否有替代该监听器的方法?或者任何与我可以在 "contextDestroyed" 方法中调用的方法完全相同的方法?
不再需要这样的侦听器。但是,在取消部署时关闭你 CacheManager
被认为是礼貌。如果您在 ServletContextListener
中创建它,那么在那里销毁它似乎是个好地方。
我不认为 Ehcache 会导致类加载器内存泄漏,但这并非不可能。
诊断它的正确方法是取消部署,然后进行堆转储并查找(在像 VisualVM 这样的工具中)来自 war 的包仍然存在,然后找到它的类加载器,最后类加载器的 GC 根。您的泄漏将位于 GC 根目录中。