在Wildfly 8.2.1上部署的Java 8应用程序的元空间内存流量问题

时间:2015-10-19 14:42:20

标签: java memory-leaks jms wildfly metaspace

问题说明

我注意到我们在Wildfly 8.2.1上的每个Java8应用程序的部署使用了大约30-40 MB的Metaspace内存池。这很好,但事实是,一旦我重新部署相同的应用程序,Metaspace内存使用量将增加相同的30-40 MB,而旧的已分配的内存不会被释放。

我甚至不会注意到它,但问题是我们有大约20个应用程序,并且我不时需要同时重新部署其中的10个应用程序。这反过来会导致一幅可怕的画面。

enter image description here 基本上显示的是~10个应用程序的2次重新部署。

我不确定为什么GC无法释放分配给旧类的内存。这个服务器总共有16GB的物理内存,所以我可以重新部署所有应用程序,最多20-40次就是这样。应用服务器将达到限制,并将停止响应任何命令。

所以如果有人能帮我理解实际问题,我会非常感激:

  1. 是Java8问题吗? (jdk 1.8.0_40-b26)
  2. 是Wildfly 8.2.1问题吗?
  3. 或者答案尽可能简单,原因是我的代码库?如果是这样,那么请你指导我可能是什么原因?
  4. 与我的代码库相关的更多详细信息

    1)与Wildfly一起使用2个独立的HornetQ服务器,每个应用程序使用~5个通道,每个通道至少有5个并发消费者。这反过来导致每个应用程序至少25个线程,并且总共至少25 * 20 = 500个线程。

    2)对于所有低级JMS操作,我使用Spring JMS。

2 个答案:

答案 0 :(得分:3)

根据经验确定您在哪里以及是否有泄漏(您可能没有泄漏 - 可能只是因为合法原因在部署期间加载了合法类)您可以在正确的时间(即之前)尝试taking a heap dump或者在元空间增加之后)。然后,进行另一个堆转储。使用MATYourkit等工具区分两个堆转储。两者之间的差异将告诉您正在加载哪些类。

元空间中的泄漏是非常罕见的,因为你只有很多类可以加载,但它也可能是非常奇特的东西。

让我知道你发现了什么,快乐狩猎!这些很有趣。 : - )

答案 1 :(得分:2)

WildFly 10.0.0.Final“java.lang.OutOfMemoryError:Metaspace”出现并将被修复。请参阅遵循Agile Board of Wildfly

https://issues.jboss.org/browse/WFLY-6173