样例代码
import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;
public class Example {
public static void main(String[] args) {
PooledByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;
ByteBuf byteBuf1 = allocator.directBuffer(16 * 1024);
ByteBuf byteBuf2 = allocator.directBuffer(16 * 1024);
}
}
解读以上代码
Netty默认一次性会向操作系统申请16M的内存(虚拟地址空间), 使用Java的直接内存, 使用DirectByteBuffer对象来表达这块16M内存.
如上图, 这块内存的起始地址address=481333312, 容量capatity=16777216字节=16M
紧接着分配16KB内存
ByteBuf byteBuf1 = allocator.directBuffer(16 * 1024);
以上代码申请16KB的内存, 由于Netty已经申请了16M的内存, 就从这16M内存中分配16KB的内存出来,申请后的16KB内存使用以下PooledUnsafeDirectByteBuf对象表示
如上图, 这块16KB的起始地址memoryAddress=481333312, 偏移量offset=0, 长度length=16384字节=16KB, 用形象的图表示如下
紧接着,又需要分配16KB内存
ByteBuf byteBuf2 = allocator.directBuffer(16 * 1024);
申请后的16KB内存使用以下PooledUnsafeDirectByteBuf对象表示
如上图, 这块内存的起始地址变成了memoryAddress=481349696, 偏移量offset=16384,大小length=16384.
之所以它的起始地址是481349696, 是因为这块16KB的内存是在上一个16KB的内存基础上紧挨着分配的, 16M的起始地址=481333312, 上一个分配的16KB的大小=16384, 所以481333312+16384正好等于481349696, 用形象的图表示如下