【发布时间】:2018-03-22 18:28:38
【问题描述】:
我对 Netty 的直接内存管理有疑问。
我通过以下方式创建一个直接缓冲区:
@GetMapping("/new/buffer/netty/unpool")
@Synchronized
public void newBufferNetty() {
UnpooledByteBufAllocator allocator = UnpooledByteBufAllocator.DEFAULT;
ByteBuf buffer = allocator.buffer(100 * 1024 * 1024);
_myByteBufList.add(buffer);
log.info("buffer[{}] created", buffer);
}
然后我观察top生成的信息,发现内存没有变化(RES、SWAP和free)。我很困惑,因为如果我以像ByteBuffer.allocateDirect(1024*1024*100); 这样的 NIO 方式执行它是可以的(操作系统内存信息会改变)。
查了源码后发现NIO是通过new DirectByteBuffer(cap)创建的directByteBuffer,而Netty其实是new DirectByteBuffer(addr, cap)创建的。在后一种方式中,Netty 没有调用Bits.reserve(size, cap),这就是我认为top 没有显示变化的原因。
我还发现 Netty 使用自己的计数器 DIRECT_MEMORY_COUNTER 来跟踪它分配的直接内存。
我的问题是:
为什么Netty在分配直接内存时不调用
Bits.reserve?为什么 Netty 必须使用自己的计数器来监控直接内存的使用情况?
(这是最让我困惑的一个)为什么我创建Netty缓冲区(UnpooledUnsafeNoCleanerDirectByteBuf)时os内存没有变化
非常感谢您。
【问题讨论】: