性能问答>OOM 用 320 x 16MB Netty DirectByteBuffer 对象杀死了 JVM>
3回复
3年前

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云监控

请问我应该怎么控制使用的内存量?

3088 阅读
请先登录,查看3条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步