问题描述
我注意到我们的一个Java8应用程序在Wildfly 8.2.1上的每次部署都会从Metaspace内存池中使用大约30-40 MB。这很好,但问题在于,一旦我重新部署同一个应用程序,Metaspace内存使用量就会增加相同的30-40 MB,而旧的已分配内存不会被释放。
我甚至可能都没有注意到它,但问题是我们有大约20个应用程序,有时我需要同时重新部署其中的10个。这反过来又导致了一个可怕的情况。
我不确定为什么GC不能释放分配给旧类的内存。该服务器总共有16GB物理内存,所以我最多可以重新部署所有应用程序20-40次,然后就完成了。应用服务器将达到极限并停止响应任何命令。
因此,如果有人能帮助我了解实际问题是什么,我将非常感激:
- 这是Java8的问题吗?(jdk 1.8.0_40-b26)
- 这是Wildfly 8.2.1的问题吗?
- 或者答案可能是最简单的,即原因在于我的代码库?如果是这样,请指导我实际原因是什么?
与我的代码库相关的一些详细信息
1)与Wildfly一起,我使用了2个独立的HornetQ服务器,每个应用程序都使用至少5个通道,并且每个通道都有至少5个并发消费者。这反过来又导致每个应用程序至少有25个线程,并且总共至少有25*20 = 500个线程。
2)对于所有低级JMS操作,我使用Spring JMS。