OOM 用 320 x 16MB Netty DirectByteBuffer 对象杀死了 JVM
我在带有args的7.5GB RAM服务器(没有交换区)中运行一个应用:
-Xmx3g -Xms3g -Xlog:gc -XX:+UseG1GC -XX:MaxGCPauseMillis=1000 -XX:MaxDirectMemorySize=500m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Dio.netty.maxDirectMemory=0 -Djdk.n maxCachedBufferSize=104857
进程的RSS一直在增加,但是堆90%都是空闲的,直到linux oom killer把它kill掉。
然后我进行了堆转储:
SELECT db, db.capacity, classof(inbounds(db).get(0)).getName() FROM java.nio.DirectByteBuffer db WHERE classof(inbounds(db).get(0)).getName().startsWith( “io.netty”)
它产生了320个DirectByteBuffer实例,容量==16MB,来自 io.netty.buffer.PoolThreadCache$MemoryRegionCache$Entry
(我觉得不是所有的“容量”都是物理分配的,因为这样会超过5GB)
这个应用不直接使用Netty,一些依赖是:S3、Redisson版本-> 4.1.58。 使用grpc-netty-shaded(1.34.1)进行Google云监控
请问我应该怎么控制使用的内存量?