野飞服务器10内存泄漏问题

19
我正在使用wildfly 10.0.0 Final版本。每当我卸载/部署模块9-10次时,我会收到“java.lang.OutOfMemoryError: GC overhead limit exceeded error”错误,同时wildfly的内存使用量缓慢增加,从未减少,然后再次出现“java.lang.OutOfMemoryError: GC overhead limit exceeded error”。
在应用程序取消部署后,Wildfly不会释放内存,并在部署时不断增加,因此导致GC开销过大。
以前,我使用wildfly 9版本时没有遇到这个问题。
我尝试了下面链接中给出的修复方法,用最新版本替换核心、servlet和websocket模块,但对我没用。
https://developer.jboss.org/message/959286

有人可以告诉我如何解决这个问题吗。

1个回答

27

你需要增加堆内存。为此,

编辑bin/standalone.conf配置文件,寻找第一次出现的JAVA_OPTS

然后根据需要更改-Xmx选项。

如果你使用的是Java 8,则:

更改:

JAVA_OPTS=”-Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true”

致:

JAVA_OPTS=”-Xms64m -Xmx2G -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=2G -Djava.net.preferIPv4Stack=true”

资源链接:

WildFly 10 — java.lang.OutOfMemoryError: Metadata space

更新: 卸载后未卸载类

Martin Kouba如下所述

  1. 卸载并不一定意味着类被卸载 - 它取决于JVM设置(对于Java 8的-XX:MaxMetaspaceSize等)。
  2. 我已经验证了在附带的复制程序中进行50次部署/卸载周期后(并使用-XX:MaxMetaspaceSize = 128m):

对于WildFly 10.0.0.Final,“java.lang.OutOfMemoryError:Metaspace”出现

对于WildFly 10.1.0-SNAPSHOT(修复了WFLY-6347合并),没有OOM错误发生(metaspace被垃圾收集)

在检查堆转储后,我确定了org.jboss.el.cache.BeanPropertiesCache是根本原因。 在这种情况下,它会对person.joey.test.TestClientBean类保持硬引用,从而有效地阻止相关的ModuleClassLoader进行垃圾回收。

枚举值与静态常量类似处理 - 也就是说,它们不会被垃圾回收,除非其所有者类的类加载器被垃圾回收。

这就是为什么person.joey.test.RequestType值会保留在内存中。如上所述,OmniFaces只会放大影响,因为它持有BeanManager的引用。


1
我已经完成了,但问题是WildFly在取消部署后不释放内存,在重新部署后增加了内存使用量,导致GC开销。 - kirti
4
我完全不同意。这只会延缓OutOfMemoryError的出现,它将在一些部署后出现。可能这是一个bug...我知道的唯一解决方案是在部署之前重新启动Wildfly。 - Jonathan Simas
1
直到今天2020年仍在发生。 - aswzen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接