Java 8 个部署在 Wildfly 8.2.1 上的应用程序的元空间内存消耗问题
Metaspace memory concumption issues of Java 8 applications deployed on Wildfly 8.2.1
问题描述
我注意到,我们的 Java8 应用程序之一在 Wildfly 8.2.1 上的每次部署都会使用元空间内存池中的大约 30-40 MB。这很好,但问题是,一旦我重新部署同一个应用程序,Metaspace 内存使用量就会增加同样的 30-40 MB,而旧的已经分配的内存不会被释放。
我什至不会注意到它,但问题是我们有大约 20 个应用程序,有时我需要同时重新部署多达 10 个应用程序。这反过来会导致一幅可怕的画面。
基本上显示的是大约 10 个应用程序的 2 次重新部署。
我不确定为什么 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。
要根据经验确定泄漏的位置和是否存在泄漏(您可能没有泄漏 - 它可能只是合法的 类 在部署期间出于合法原因加载)您可以尝试 taking a heap dump at the right time (i.e. before or after the increase in the metaspace occurs). Then, take another heap dump. Diff the two heap dumps using a tool like MAT or Yourkit。两者之间的差异将告诉您正在加载哪个 类。
元空间中的泄漏非常罕见,因为您只有这么多 类 可以加载,但它也可能是非常奇特的东西。
让我知道您发现了什么,祝您狩猎愉快!这些很有趣。 :-)
WildFly 10.0.0.Final "java.lang.OutOfMemoryError: Metaspace" 发生并将被修复。参考关注Wildfly的Agile Board
问题描述
我注意到,我们的 Java8 应用程序之一在 Wildfly 8.2.1 上的每次部署都会使用元空间内存池中的大约 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。
要根据经验确定泄漏的位置和是否存在泄漏(您可能没有泄漏 - 它可能只是合法的 类 在部署期间出于合法原因加载)您可以尝试 taking a heap dump at the right time (i.e. before or after the increase in the metaspace occurs). Then, take another heap dump. Diff the two heap dumps using a tool like MAT or Yourkit。两者之间的差异将告诉您正在加载哪个 类。
元空间中的泄漏非常罕见,因为您只有这么多 类 可以加载,但它也可能是非常奇特的东西。
让我知道您发现了什么,祝您狩猎愉快!这些很有趣。 :-)
WildFly 10.0.0.Final "java.lang.OutOfMemoryError: Metaspace" 发生并将被修复。参考关注Wildfly的Agile Board