ByteBuf使用的Direct Buffer没有完全释放
Direct Buffer used by ByteBuf is not fully released
我正在使用带直接缓冲区的 Netty 4.1.17-Final。
我们在测试程序中发送和接收100MB的byte[],当解码器达到100MB时,我们什么也不做就丢弃它。
@Override
public void decode(ByteBuffer _in, List<Object> _out) {
if (_in.remaining() == size) { // size = 100 * 1024 * 1024
_in.get(new byte[size]);
}
}
我在测试结束时明确执行了 GC,并尝试休眠约 10 秒以期待 Cleaner 释放。
但是,Direct Buffer 并没有部分释放,但 Netty 并没有报告 ByteBuf 泄漏。
Direct Buffer graph link
我已经为测试程序提供了以下选项。
-Dio.netty.maxDirectMemory=0 -Dio.netty.leakDetection.level=PARANOID
我在下面问了相关问题。
默认情况下 netty 池缓冲区,所以如果您使用默认分配器,这里就是这种情况。
如果您不想合并,您应该使用 UnpooledByteBufAllocator
。这可以在引导过程中使用 ChannelOption.ALLOCATOR
.
配置
我正在使用带直接缓冲区的 Netty 4.1.17-Final。
我们在测试程序中发送和接收100MB的byte[],当解码器达到100MB时,我们什么也不做就丢弃它。
@Override
public void decode(ByteBuffer _in, List<Object> _out) {
if (_in.remaining() == size) { // size = 100 * 1024 * 1024
_in.get(new byte[size]);
}
}
我在测试结束时明确执行了 GC,并尝试休眠约 10 秒以期待 Cleaner 释放。 但是,Direct Buffer 并没有部分释放,但 Netty 并没有报告 ByteBuf 泄漏。
Direct Buffer graph link
我已经为测试程序提供了以下选项。
-Dio.netty.maxDirectMemory=0 -Dio.netty.leakDetection.level=PARANOID
我在下面问了相关问题。
默认情况下 netty 池缓冲区,所以如果您使用默认分配器,这里就是这种情况。
如果您不想合并,您应该使用 UnpooledByteBufAllocator
。这可以在引导过程中使用 ChannelOption.ALLOCATOR
.