netty PoolChunk 中积累的内存

Memory accumulated in netty PoolChunk

您好,我想了解为什么我的应用程序内存消耗如此之大,所以我用 visualjvm 下载了一个 heapdump,然后用 eclipse mat 对其进行了分析。它发现了以下问题:

One instance of "io.netty.buffer.PoolChunk" loaded by "jdk.internal.loader.ClassLoaders$AppClassLoader @ 0x7f04ba5b0" occupies 16,793,832 (32.78 %) bytes. The memory is accumulated in one instance of "byte[]" loaded by "<system class loader>".

任何人都可以就如何解决这个问题给我一些建议吗?要查找和搜索哪些数据?

我的第一个尝试是设置 -Dio.netty.allocator.type=unpooled 参数,这消除了这个怀疑与字节相关的问题,但引入了其他 2 个与 class 加载程序相关的问题。

问候

Netty 默认使用池化 ByteBufAllocator 以“块”形式分配内存。那就是你在这里看到的。所以它基本上分配一个块,然后在需要内存时切出这个块的内存。一旦无法填满内存,就需要分配新的块,依此类推。

添加 -Dio.netty.allocator.type=unpooled 显着减少了内存

在我们的例子中,with 和 unpooled 以及 pooled 的性能相似

但 GC 的峰值很小 - 但总体上未合并的响应时间更好