9

问题描述

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

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

在此处输入图像描述 基本上显示的是约 10 个应用程序的 2 次重新部署。

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

因此,如果有人可以帮助我了解实际问题可能是什么,我将非常感激:

  1. 这是Java8的问题吗?(jdk 1.8.0_40-b26)
  2. 这是 Wildfly 8.2.1 的问题吗?
  3. 或者答案是否尽可能简单,原因是我的代码库?如果是这样,那么请您指导我可能是什么实际原因?

与我的代码库相关的更多细节

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

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

4

2 回答 2

4

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

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

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

于 2015-10-20T05:50:57.180 回答
1

WildFly 10.0.0.Final "java.lang.OutOfMemoryError: Metaspace" 发生并将被修复。参考 Wildfly 敏捷开发板

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

于 2016-07-27T07:19:18.320 回答