我在 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.nio.maxCachedBufferSize=104857
当堆90%为空时,进程的RSS不断增加直到linux内存杀手采取行动。
进行了堆转储:
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")
结果是来自 io.netty.buffer.PoolThreadCache$MemoryRegionCache$Entry 的 320 个 DirectByteBuffer 实例,容量==16MB
(我猜并不是所有的“容量”都是物理分配的,因为它会超过5GB)
该应用程序不直接使用 Netty,但一些依赖项是:S3、Redisson、版本 -> 4.1.58。使用 grpc-netty-shaded 进行谷歌云监控 (1.34.1)
如何控制内存使用量?