问题描述
我注意到,我们在 Wildfly 8.2.1 上的 Java8 应用程序的每个部署都使用来自 Metaspace 内存池的大约 30-40 MB。这很好,但问题是,一旦我重新部署同一个应用程序,元空间内存使用量将增加相同的 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。