Netty源碼分析第5章(ByteBuf)---->第3節: 緩衝區分配器

 

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);

 

 

newDirectBuffernewHeapBuffer兩個抽象方法中, 在其子類PooledByteBufAllocatorUnpooledByteBufAllocator中都有實現

咱們以UnpooledByteBufAllocatornewHeapBuffer方法爲例, 看其實現:

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對象, 也就是一個UnsafeByteBuf對象

 

若是當前環境不能建立unsafe對象, 則經過new UnpooledHeapByteBuf(this, initialCapacity, maxCapacity)這種方方式建立一個UnpooledHeapByteBuf對象, 也就是非UnsafeByteBuf對象

從這裏能看出, 其實在建立ByteBuf對象時, 是否建立unsafe類型的對象並非咱們本身控制的, 而是經過程序判斷當前環境來決定是否建立unsafe類型的ByteBuf對象的

 

有關ByteBufAllocator的繼承關係以下:

5-3-1

 

上一節: ByteBuf的分類

下一節: PooledByteBufAllocator簡述

相關文章
相關標籤/搜索