问题说明
我注意到我们在Wildfly 8.2.1上的每个Java8应用程序的部署使用了大约30-40 MB的Metaspace内存池。这很好,但事实是,一旦我重新部署相同的应用程序,Metaspace内存使用量将增加相同的30-40 MB,而旧的已分配的内存不会被释放。
我甚至不会注意到它,但问题是我们有大约20个应用程序,并且我不时需要同时重新部署其中的10个应用程序。这反过来会导致一幅可怕的画面。
我不确定为什么GC无法释放分配给旧类的内存。这个服务器总共有16GB的物理内存,所以我可以重新部署所有应用程序,最多20-40次就是这样。应用服务器将达到限制,并将停止响应任何命令。
所以如果有人能帮我理解实际问题,我会非常感激:
与我的代码库相关的更多详细信息
1)与Wildfly一起使用2个独立的HornetQ服务器,每个应用程序使用~5个通道,每个通道至少有5个并发消费者。这反过来导致每个应用程序至少25个线程,并且总共至少25 * 20 = 500个线程。
2)对于所有低级JMS操作,我使用Spring JMS。
答案 0 :(得分:3)
根据经验确定您在哪里以及是否有泄漏(您可能没有泄漏 - 可能只是因为合法原因在部署期间加载了合法类)您可以在正确的时间(即之前)尝试taking a heap dump或者在元空间增加之后)。然后,进行另一个堆转储。使用MAT或Yourkit等工具区分两个堆转储。两者之间的差异将告诉您正在加载哪些类。
元空间中的泄漏是非常罕见的,因为你只有很多类可以加载,但它也可能是非常奇特的东西。
让我知道你发现了什么,快乐狩猎!这些很有趣。 : - )
答案 1 :(得分:2)
WildFly 10.0.0.Final“java.lang.OutOfMemoryError:Metaspace”出现并将被修复。请参阅遵循Agile Board of Wildfly