Netty源碼分析第五章: ByteBufhtml
第三節: 緩衝區分配器api
緩衝區分配器, 顧明思議就是分配緩衝區的工具, 在netty中, 緩衝區分配器的頂級抽象是接口ByteBufAllocator, 裏面定義了有關緩衝區分配的相關api工具
抽象類AbstractByteBufAllocator實現了ByteBufAllocator接口, 而且實現了其大部分功能源碼分析
和AbstractByteBuf同樣, AbstractByteBufAllocator也實現了緩衝區分配的骨架邏輯, 剩餘的交給其子類this
以其中的分配ByteBuf的方法爲例, 對其作簡單的介紹:spa
public ByteBuf buffer() { if (directByDefault) { return directBuffer(); } return heapBuffer(); }
這裏if (directByDefault)會判斷默認建立的ByteBuf是否是一個基於直接內存的ByteBuf, 也就是direct類型的ByteBuf, 若是是, 則經過directBuffer()方法返回direct類型的ByteBuf, 不然, 會經過heapBuffer()返回heap類型的ByteBufnetty
跟到directBuffer()方法中:code
public ByteBuf directBuffer() { return directBuffer(DEFAULT_INITIAL_CAPACITY, Integer.MAX_VALUE); }
這裏又調用了一個重載directBuffer方法, 其中DEFAULT_INITIAL_CAPACITY表明分配的默認容量, Integer.MAX_VALUE表示分配的ByteBuf可擴容的最大容量, 也就是Integer類型的最大值, 咱們再跟進去:orm
public ByteBuf directBuffer(int initialCapacity, int maxCapacity) { if (initialCapacity == 0 && maxCapacity == 0) { return emptyBuf; } validate(initialCapacity, maxCapacity); return newDirectBuffer(initialCapacity, maxCapacity); }
這裏判斷若是初始容量和最大容量都爲0的話, 則返回一個emptyBuf的成員變量, emptyBuf表明一個空的ByteBufhtm
而後經過validate方法進行參數驗證
最後newDirectBuffer建立一個Direct類型的ByteBuf, 並將初始容量和最大容量傳入
在AbstractByteBufAllocator中, newDirectBuffer是一個抽象方法, 由其子類實現
protected abstract ByteBuf newDirectBuffer(int initialCapacity, int maxCapacity);
咱們回到緩衝區分配的方法:
public ByteBuf buffer() { if (directByDefault) { return directBuffer(); } return heapBuffer(); }
剛纔簡單剖析了directBuffer()的分配, 如今在繼續跟到heapBuffer()中, 看其分配heap類型的ByteBuf的抽象邏輯:
public ByteBuf heapBuffer() { return heapBuffer(DEFAULT_INITIAL_CAPACITY, Integer.MAX_VALUE); }
這裏一樣調用了重載的heapBuffer, 並傳入了初始容量和最大容量
再繼續跟heapBuffer方法:
public ByteBuf heapBuffer(int initialCapacity, int maxCapacity) { if (initialCapacity == 0 && maxCapacity == 0) { return emptyBuf; } validate(initialCapacity, maxCapacity); return newHeapBuffer(initialCapacity, maxCapacity); }
一樣, 這裏若是初始容量和最大容量都爲空的話, 返回一個表明空的ByteBuf
而後經過validate方法進行參數驗證
最後經過newHeapBuffer方法建立一個新的heap類型的ByteBuf
一樣, newHeapBuffer方法在AbstractByteBufAllocator中也是一個抽象方法, 具體邏輯交給其子類實現
protected abstract ByteBuf newHeapBuffer(int initialCapacity, int maxCapacity);
newDirectBuffer和newHeapBuffer兩個抽象方法中, 在其子類PooledByteBufAllocator和UnpooledByteBufAllocator中都有實現
咱們以UnpooledByteBufAllocator的newHeapBuffer方法爲例, 看其實現:
protected ByteBuf newHeapBuffer(int initialCapacity, int maxCapacity) { return PlatformDependent.hasUnsafe() ? new UnpooledUnsafeHeapByteBuf(this, initialCapacity, maxCapacity) : new UnpooledHeapByteBuf(this, initialCapacity, maxCapacity); }
裏實現方式其實很簡單, 首先經過PlatformDependent.hasUnsafe()判斷當前運行環境是否能建立unsafe對象, 若是能, 則直接經過new UnpooledUnsafeHeapByteBuf(this, initialCapacity, maxCapacity)方式建立一個UnpooledUnsafeHeapByteBuf對象, 也就是一個Unsafe的ByteBuf對象
若是當前環境不能建立unsafe對象, 則經過new UnpooledHeapByteBuf(this, initialCapacity, maxCapacity)這種方方式建立一個UnpooledHeapByteBuf對象, 也就是非Unsafe的ByteBuf對象
從這裏能看出, 其實在建立ByteBuf對象時, 是否建立unsafe類型的對象並非咱們本身控制的, 而是經過程序判斷當前環境來決定是否建立unsafe類型的ByteBuf對象的
有關ByteBufAllocator的繼承關係以下:
5-3-1