Wildfly或应用程序内存泄漏的常见堆行为?

时间:2019-04-22 03:05:50

标签: wildfly heap-memory visualvm

我们在Wildfly 14.0.1中运行应用程序,其-Xmx为4096,与OpenJDK 11.0.2一起运行。自从我们以前有OOM异常以来,我一直在使用VisualVM 1.4.2监视我们的堆(因为-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,然后又下降了下来,再次上升。这是一张图片:image of the memory spikes

这是没有客户端连接且应用程序中没有活动的情况。我们确实使用Apache File IO监视远程目录,我们有JMS主题,等等,所以这并不意味着应用程序完全处于空闲状态,但是日志记录为零。

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

我只是看到堆监视器和.hprof分析之间的断开连接。因此,没有一种方法可以判断导致堆达到900MB峰值的原因。

我的问题是,在Wildfly中运行这些堆峰值是否是完全可以预期的,或者我们的应用程序中是否有一些东西正在纺成一堆对象然后被GC处理?在执行“组件”报告时,应用程序包结构中的对象构成了非常少量的转储。不清楚的是,我们很容易在没有适当关闭的情况下调用事物,等等。

0 个答案:

没有答案