欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Netty分布式ByteBuf的分類方式源碼解析

 更新時間:2022年03月28日 14:42:03   作者:向南是個萬人迷  
這篇文章主要為大家介紹了Netty分布式ByteBuf的分類方式源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

上一小節(jié)簡單介紹了AbstractByteBuf這個抽象類, 這一小節(jié)對其子類的分類做一個簡單的介紹

ByteBuf根據(jù)不同的分類方式 會有不同的分類結(jié)果

我們首先看第一種分類方式

1.Pooled和Unpooled

pooled是從一塊內(nèi)存里去取一段連續(xù)內(nèi)存封裝成byteBuf

具體標志是類名以Pooled開頭的ByteBuf, 通常就是Pooled類型的ByteBuf, 比如: PooledDirectByteBuf或者pooledHeapByteBuf

有關如何分配一塊連續(xù)的內(nèi)存, 我們之后的章節(jié)會講到

Unpooled是分配的時候直接調(diào)用系統(tǒng)api進行實現(xiàn), 具體標志是以Unpooled開頭的ByteBuf, 比如UnpooledDirectByteBuf, UnpooledHeapByteBuf

再看第二種分類方式

2.基于直接內(nèi)存的ByteBuf和基于堆內(nèi)存的ByteBuf

基于直接內(nèi)存的ByteBuf, 具體標志是類名中包含單詞Direct的ByteBuf, 比如UnpooledDirectByteBuf, PooledDirectByteBuf等

基于堆內(nèi)存的ByteBuf, 具體標志是類名中包含單詞heap的ByteBuf, 比如UnpooledHeapByteBuf, PooledHeapByteBuf

結(jié)合以上兩種方式, 這里通過其創(chuàng)建的方式去簡單對其分類做個解析

這里第一種分類的Pooled, 也就是分配一塊連續(xù)內(nèi)存創(chuàng)建byteBuf, 這一小節(jié)先不進行舉例, 會在之后的小節(jié)講到

這里主要就看Unpooled, 也就是調(diào)用系統(tǒng)api的方式創(chuàng)建byteBuf, 在直接內(nèi)存和堆內(nèi)存中有什么區(qū)別

這里以UnpooledDirectByteBuf和UnpooledHeapByteBuf這兩種為例, 簡單介紹其創(chuàng)建方式:

首先看UnpooledHeapByteBuf的byetBuf, 這是基于內(nèi)存創(chuàng)建ByteBuf, 并且是直接調(diào)用系統(tǒng)api

我們看UnpooledHeapByteBuf的byetBuf的構造方法:

protected UnpooledHeapByteBuf(ByteBufAllocator alloc, int initialCapacity, int maxCapacity) {
     this(alloc, new byte[initialCapacity], 0, 0, maxCapacity);
 }

這里調(diào)用了自身的構造方法, 參數(shù)中創(chuàng)建了新的字節(jié)數(shù)組, 初始長度為初始化的內(nèi)存大小, 讀寫指針初始位置都是0, 并傳入了最大內(nèi)存大小

從這里看出, 有關堆內(nèi)存的Unpooled類型的分配, 是通過字節(jié)數(shù)組進行實現(xiàn)的

再往下跟:

protected UnpooledHeapByteBuf(ByteBufAllocator alloc, byte[] initialArray, int maxCapacity) {
    this(alloc, initialArray, 0, initialArray.length, maxCapacity);
}

繼續(xù)跟:

private UnpooledHeapByteBuf(
        ByteBufAllocator alloc, byte[] initialArray, int readerIndex, int writerIndex, int maxCapacity) {
    super(maxCapacity);
    //忽略驗證代碼
    this.alloc = alloc;
    setArray(initialArray);
    setIndex(readerIndex, writerIndex);
}

跟到setAarry方法中:

private void setArray(byte[] initialArray) {
    array = initialArray;
    tmpNioBuf = null;
}

將新創(chuàng)建的數(shù)組賦值為自身的array屬性

回到構造函數(shù)中, 跟進setIndex方法:

public ByteBuf setIndex(int readerIndex, int writerIndex) {
    //忽略驗證代碼
    setIndex0(readerIndex, writerIndex);
    return this;
}

這里實際上是調(diào)用了AbstractByteBuf的setIndex方法

我們跟進setIndex0方法中:

final void setIndex0(int readerIndex, int writerIndex) {
    this.readerIndex = readerIndex;
    this.writerIndex = writerIndex;
}

這里設置了讀寫指針, 根據(jù)之前的調(diào)用鏈我們知道, 這里將讀寫指針位置都設置為了0

介紹完UnpooledHeapByteBuf的初始化, 我們繼續(xù)看UnpooledDirectByteBuf這個類的構造, 顧明思議, 是基于堆外內(nèi)存, 并且同樣也是調(diào)用系統(tǒng)api的方式進行實現(xiàn)的

我們看其構造方法:

protected UnpooledDirectByteBuf(ByteBufAllocator alloc, int initialCapacity, int maxCapacity) {
    super(maxCapacity);
    //忽略驗證代碼
    this.alloc = alloc;
    setByteBuffer(ByteBuffer.allocateDirect(initialCapacity));
}

我們關注下setByteBuffer中的參數(shù)ByteBuffer.allocateDirect(initialCapacity)

我們在這里看到, 這里通過jdk的ByteBuffer直接調(diào)用靜態(tài)方法allocateDirect分配了一個基于直接內(nèi)存的ByteBuffer, 并設置了初始內(nèi)存

再跟到setByteBuffer方法中:

private void setByteBuffer(ByteBuffer buffer) {
    ByteBuffer oldBuffer = this.buffer;
    if (oldBuffer != null) {
        //代碼忽略
    }
    this.buffer = buffer;
    tmpNioBuf = null;
    capacity = buffer.remaining();
}

我們看到在這里將分配的ByteBuf設置到當前類的成員變量中

以上兩種實例, 我們會對上面所講到的兩種分類有個初步的了解

這里要注意一下, 基于堆內(nèi)存創(chuàng)建ByteBuf, 可以不用考慮對象回收, 因為虛擬機會進行垃圾回收, 但是堆外內(nèi)存在虛擬機的垃圾回收機制的作用域之外, 所以這里要考慮手動回收對象

最后, 我們看第三種分類方式:

3.safe和unsafe

首先從名字上看, safe代表安全的, unsafe代表不安全的

這個安全與不安全的定義是什么呢

其實在我們jdk里面有unsafe對象, 可以通過unsafe對象直接拿到內(nèi)存地址, 基于內(nèi)存地址可以進行讀寫操作

如果是Usafe類型的byteBuf, 則可以直接拿到byteBuf在jvm中的具體內(nèi)存, 可以通過調(diào)用jdk的Usafe對象進行讀寫, 所以這里代表不安全

而非Usafe不能拿到jvm的具體內(nèi)存, 所以這里代表安全

具體標志是如果類名中包含unsafe這個單詞的ByteBuf, 可以認為是一個unsafe類型的ByteBuf, 比如PooledUnsafeHeapByteBuf或者PooledUnsafeDirectByteBuf

以PooledUnsafeHeapByteBuf的_getByte方法為例:

protected byte _getByte(int index) {
    return UnsafeByteBufUtil.getByte(memory, idx(index));
}

這里memory代表byebuffer底層分配內(nèi)存的首地址, idx(index)代表當前指針index距內(nèi)存memory的偏移地址, UnsafeByteBufUtil的getByte方法, 就可以直接通過這兩個信息通過jdk底層的unsafe對象拿到jdk底層的值

有關AbstractByteBuf的主要實現(xiàn)類和繼承關系, 如下圖所示:

以上就是Netty分布式ByteBuf的分類方式源碼解析的詳細內(nèi)容,更多關于Netty分布式ByteBuf分類方式的資料請關注腳本之家其它相關文章!

相關文章

  • Java實現(xiàn)電影院訂票系統(tǒng)代碼

    Java實現(xiàn)電影院訂票系統(tǒng)代碼

    這篇文章主要介紹了Java實現(xiàn)電影院訂票系統(tǒng)代碼,代碼實現(xiàn)了界面類登錄注冊類,用戶類等,具有一定參考價值,需要的朋友可以參考下。
    2017-11-11
  • Java注釋代碼執(zhí)行方法解析

    Java注釋代碼執(zhí)行方法解析

    這篇文章主要介紹了Java注釋代碼執(zhí)行方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Java @SentinelResource全面介紹

    Java @SentinelResource全面介紹

    在實際應用過程中,我們可能需要限流的層面不僅限于接口。可能對于某個方法的調(diào)用限流,對于某個外部資源的調(diào)用限流等都希望做到控制。對此,我們需要學習使用@SentinelResource注解,靈活的定義控制資源以及如何配置控制策略
    2022-08-08
  • Java超詳細大文件分片上傳代碼

    Java超詳細大文件分片上傳代碼

    文件上傳是一個很常見的功能。在項目開發(fā)過程中,我們通常都會使用一些成熟的上傳組件來實現(xiàn)對應的功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧<BR>
    2022-06-06
  • 常見的java面試題

    常見的java面試題

    這篇文章主要為大家詳細介紹了常見的java面試題,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • java 實現(xiàn)圖片像素質(zhì)量壓縮與圖片長寬縮放

    java 實現(xiàn)圖片像素質(zhì)量壓縮與圖片長寬縮放

    這篇文章主要介紹了java 實現(xiàn)圖片像素質(zhì)量壓縮與圖片長寬縮放,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java基于dom4j包實現(xiàn)對XML解析的方法

    java基于dom4j包實現(xiàn)對XML解析的方法

    這篇文章主要介紹了java基于dom4j包實現(xiàn)對XML解析的方法,結(jié)合實例形式分析了java針對xml格式數(shù)據(jù)的相關解析操作實現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • Java 中的語法糖,真甜

    Java 中的語法糖,真甜

    語法糖(Syntactic sugar),也叫做糖衣語法,是英國科學家發(fā)明的一個術語,通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會.這篇文章主要介紹了Java 中的語法糖知識,需要的朋友可以參考下
    2020-12-12
  • 詳解SpringMVC中的異常處理機制

    詳解SpringMVC中的異常處理機制

    本篇文章將為大家詳細介紹一下springmvc的異常處理機制,用到了ControllerAdvice和ExceptionHandler注解,感興趣的小伙伴可以了解一下
    2022-07-07
  • JAVA 筆記 ClassLoader.getResourceAsStream() 與 Class.getResourceAsStream()的區(qū)別

    JAVA 筆記 ClassLoader.getResourceAsStream() 與 Class.getResourc

    這篇文章主要介紹了JAVA 筆記 ClassLoader.getResourceAsStream() 與 Class.getResourceAsStream()的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07

最新評論