Netty内存申请(简)

2022-03-11  本文已影响0人  赵信信官属

样例代码


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内存.

16M直接内存

如上图, 这块内存的起始地址address=481333312, 容量capatity=16777216字节=16M

紧接着分配16KB内存

ByteBuf byteBuf1 = allocator.directBuffer(16 * 1024);

以上代码申请16KB的内存, 由于Netty已经申请了16M的内存, 就从这16M内存中分配16KB的内存出来,申请后的16KB内存使用以下PooledUnsafeDirectByteBuf对象表示

分配16KB内存

如上图, 这块16KB的起始地址memoryAddress=481333312, 偏移量offset=0, 长度length=16384字节=16KB, 用形象的图表示如下

从16M内存中分配16KB

紧接着,又需要分配16KB内存

ByteBuf byteBuf2 = allocator.directBuffer(16 * 1024);

申请后的16KB内存使用以下PooledUnsafeDirectByteBuf对象表示

再次分配16KB内存

如上图, 这块内存的起始地址变成了memoryAddress=481349696, 偏移量offset=16384,大小length=16384.
之所以它的起始地址是481349696, 是因为这块16KB的内存是在上一个16KB的内存基础上紧挨着分配的, 16M的起始地址=481333312, 上一个分配的16KB的大小=16384, 所以481333312+16384正好等于481349696, 用形象的图表示如下

2块16KB内存分配情况
上一篇 下一篇

猜你喜欢

热点阅读