首页 > 解决方案 > Wildfly 的常见堆行为或应用程序内存泄漏?

问题描述

我们在 Wildfly 14.0.1 中运行我们的应用程序,-Xmx 为 4096,使用 OpenJDK 11.0.2 运行。我一直在使用 VisualVM 1.4.2 来监控我们的堆,因为我们之前遇到过 OOM 异常(因为我们的 -Xmx 只有 512,这非常糟糕)。

虽然我们现在的内存分配很好,但我们不再发生 OOM 异常,即使有大量的客户端和处理发生,我们也离 -Xmx4096 不远(服务器有 16GB,所以内存不是问题) ,我看到一些奇怪的堆行为,我无法弄清楚它来自哪里。

使用 VisualVM、Eclipse MemoryAnalyzer 以及 heaphero.io,我得到如下摘要:

总字节数:460,447,623

总课程:35,708

总实例:2,660,155

类加载器:1,087

GC 根:4,200

待完成的对象数:0

但是,在查看堆监视器时,我发现在 GC 运行之前,已用堆在 4 分钟内增加了大约 450MB,然后又回落,再次达到峰值。这是一张图片:记忆尖峰的图像

这是没有客户端连接并且我们的应用程序中没有任何活动发生的情况。我们确实使用 Apache File IO 来监控远程目录,我们有 JMS 主题等,所以它不像应用程序完全空闲,但是有零日志记录等等。

我最大的对象是众所周知的 io.netty.buffer.PoolChunk,它在堆转储中占我内存使用量的 60% 左右,总量仍然在 460MB 左右,所以我很困惑为什么堆监视器从 ~425MB重复到〜900MB,无论我在哪里拍摄快照,我都看不到对象数量或内存使用量有任何大幅增加。

我只是看到堆监视器和 .hprof 分析之间存在脱节。所以没有办法判断是什么导致堆达到 900MB 的峰值。

我的问题是,在 Wildfly 中运行时是否完全可以预料到这些堆峰值,或者我们的应用程序中是否有一些东西正在旋转一堆对象,然后得到 GC'd?在进行组件报告时,我们应用程序包结构中的对象构成了极少量的转储。这并不清楚我们,我们很容易在没有适当关闭的情况下调用事物,等等。

标签: wildflyheap-memoryvisualvm

解决方案


推荐阅读