Netty源码分析:PoolChunk
Chunk主要用来组织和管理多个Page的内存分配和释放。在Netty中,Chunk中的Page被构建成一颗二叉树。本博文将从源码的角度来看下PoolChunk。
1、属性和构造函数
先看下PoolChunk的属性和构造函数
final class PoolChunk<T> {
// PoolChunk会涉及到具体的内存,泛型T表示byte[](堆内存)、或java.nio.ByteBuffer(堆外内存)
final PoolArena<T> arena;//表示该PoolChunk所属的PoolArena。
final T memory;// 具体用来表示内存;byte[]或java.nio.ByteBuffer。
final boolean unpooled;// 是否是可重用的,unpooled=false表示可重用
private final byte[] memoryMap;
private final byte[] depthMap;
private final PoolSubpage<T>[] subpages;//表示该PoolChunk所包含的PoolSubpage。也就是PoolChunk连续的可用内存。
/** Used to determine if the requested capacity is equal to or greater than pageSize. */
private final int subpageOverflowMask;
private final int pageSize;//每个PoolSubpage的大小,默认为8192个字节(8K)
private final int pageShifts;
private final int maxOrder;
private final int chunkSize;
private final int log2ChunkSize;
private final int maxSubpageAllocs;
/** Used to mark memory as unusable */
private final byte unusable;
private int freeBytes; //当前PoolChunk空闲的内存。
PoolChunkList<T> parent;//一个PoolChunk分配后,会根据使用率挂在PoolArena的一个PoolChunkList中
// PoolChunk本身设计为一个链表结构
PoolChunk<T> prev;
PoolChunk<T> next;
PoolChunk(PoolArena<T> arena, T memory, int pageSize, int maxOrder, int pageShifts, int chunkSize) {
unpooled = false;
this.arena = arena;
this.memory = memory;