java - 更新到wildfly 18后直接缓冲内存OutOfMemoryError
问题描述
更新环境后Wildfly 13
,Wildfly 18.0.1
我们经历了
A channel event listener threw an exception: java.lang.OutOfMemoryError: Direct buffer memory
at java.base/java.nio.Bits.reserveMemory(Bits.java:175)
at java.base/java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:118)
at java.base/java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:317)
at org.jboss.xnio@3.7.3.Final//org.xnio.BufferAllocator$2.allocate(BufferAllocator.java:57)
at org.jboss.xnio@3.7.3.Final//org.xnio.BufferAllocator$2.allocate(BufferAllocator.java:55)
at org.jboss.xnio@3.7.3.Final//org.xnio.ByteBufferSlicePool.allocateSlices(ByteBufferSlicePool.java:162)
at org.jboss.xnio@3.7.3.Final//org.xnio.ByteBufferSlicePool.allocate(ByteBufferSlicePool.java:149)
at io.undertow.core@2.0.27.Final//io.undertow.server.XnioByteBufferPool.allocate(XnioByteBufferPool.java:53)
at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.http.HttpReadListener.handleEventWithNoRunningRequest(HttpReadListener.java:147)
at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:136)
at io.undertow.core@2.0.27.Final//io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:59)
at org.jboss.xnio@3.7.3.Final//org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
at org.jboss.xnio@3.7.3.Final//org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66)
at org.jboss.xnio.nio@3.7.3.Final//org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:89)
at org.jboss.xnio.nio@3.7.3.Final//org.xnio.nio.WorkerThread.run(WorkerThread.java:591)
应用程序端没有任何改变。我查看了缓冲池,似乎有些资源没有被释放。我触发了几次手动 GC,但几乎没有任何反应。(正常运行时间 2 小时)
在旧配置之前它看起来像这样(正常运行时间> 250h):
现在我做了很多研究,我能找到的最接近的就是 SO 上的这篇文章。然而,这与 websockets 结合使用,但没有使用 websockets。我阅读了几篇(好)文章(1、2、3、4、5、6 )并观看了有关该主题的视频。我尝试了以下事情但没有任何效果:
- OutOfMemoryError 发生在 5GB,因为堆是 5GB => 我将 MaxDirectMemorySize 减少到 512m,然后是 64m,但是 OOM 发生得更快
- 我设置
-Djdk.nio.maxCachedBufferSize=262144
- 我检查了 IO 工作人员的数量:96 (6cpus*16),这似乎是合理的。系统通常具有短寿命线程(最大池大小为 13)。所以我猜这不可能是工人的数量
- 我切换回 ParallelGC,因为这是 Java8 中的默认设置。现在在进行手动 GC 时,至少会释放 10MB。对于 GC1,什么都没有发生。但是两个 GC 仍然无法清理。
- 为了确定,我
<websockets>
从 wildfly 配置中删除了 - 我试图在本地模拟它但失败了。
- 我使用 eclipseMAT 和 JXRay 分析了堆,但它只是指向一些内部的 Wildfly 类。
- 我将 Java 恢复到版本 8,系统仍然显示相同的行为,因此 Wildfly 是最有可能的嫌疑人。
在 eclipseMAT 中也可以找到这 1544 个对象。他们都得到了相同的大小。
唯一起作用的是完全停用 Wildfly 中的字节缓冲区。
/subsystem=io/buffer-pool=default:write-attribute(name=direct-buffers,value=false)
但是,从我读到的内容来看,这有性能缺陷吗?
那么有人知道问题是什么吗?有关其他设置/调整的任何提示?或者是否存在与此相关的已知 Wildfly 或 JVM 错误?
更新 1:关于 IO 线程 - 也许这个概念对我来说不是 100% 清楚。因为有ioThreads
值
,有线程和线程池。
从定义中可以认为每个工作线程ioThreads
创建的数量(在我的情况下为 12)?但就我而言,线程/工作人员的数量似乎仍然很低......
更新 2:我降级了 java 并且它仍然显示相同的行为。因此,我怀疑野蝇是问题的原因。
解决方案
可能是Xnio的问题。看这个问题https://issues.redhat.com/browse/JBEAP-728
推荐阅读
- javascript - 显示隐藏在 css 网格列中的下拉列表,并应用了剪辑路径
- node.js - nodejs typescript编译器在构建时传递env文件
- react-native - 获取数据反应原生
- sql - pgAdmin 如何调查数据库服务器上的流量
- javascript - 为什么密码哈希没有与 mongo 中的用户对象一起保存?
- jquery - 显示的一行总和
- c - 带有列表数据的结构初始化数组的问题
- ios - 当 Tableview 单元包含第一响应者时,它没有被回收
- c# - 如何使用 c# 在 couchbase 上创建部分索引
- python - 如何检查给定的参数数量并让python获取指定的文件(如果给定)?