最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Netty分布式ByteBuf的分類(lèi)方式源碼解析

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

上一小節(jié)簡(jiǎn)單介紹了AbstractByteBuf這個(gè)抽象類(lèi), 這一小節(jié)對(duì)其子類(lèi)的分類(lèi)做一個(gè)簡(jiǎn)單的介紹

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

我們首先看第一種分類(lèi)方式

1.Pooled和Unpooled

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

具體標(biāo)志是類(lèi)名以Pooled開(kāi)頭的ByteBuf, 通常就是Pooled類(lèi)型的ByteBuf, 比如: PooledDirectByteBuf或者pooledHeapByteBuf

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

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

再看第二種分類(lèi)方式

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

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

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

結(jié)合以上兩種方式, 這里通過(guò)其創(chuàng)建的方式去簡(jiǎn)單對(duì)其分類(lèi)做個(gè)解析

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

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

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

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

我們看UnpooledHeapByteBuf的byetBuf的構(gòu)造方法:

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

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

從這里看出, 有關(guān)堆內(nèi)存的Unpooled類(lèi)型的分配, 是通過(guò)字節(jié)數(shù)組進(jìn)行實(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);
    //忽略驗(yàn)證代碼
    this.alloc = alloc;
    setArray(initialArray);
    setIndex(readerIndex, writerIndex);
}

跟到setAarry方法中:

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

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

回到構(gòu)造函數(shù)中, 跟進(jìn)setIndex方法:

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

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

我們跟進(jìn)setIndex0方法中:

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

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

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

我們看其構(gòu)造方法:

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

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

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

再跟到setByteBuffer方法中:

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

我們看到在這里將分配的ByteBuf設(shè)置到當(dāng)前類(lèi)的成員變量中

以上兩種實(shí)例, 我們會(huì)對(duì)上面所講到的兩種分類(lèi)有個(gè)初步的了解

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

最后, 我們看第三種分類(lèi)方式:

3.safe和unsafe

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

這個(gè)安全與不安全的定義是什么呢

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

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

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

具體標(biāo)志是如果類(lèi)名中包含unsafe這個(gè)單詞的ByteBuf, 可以認(rèn)為是一個(gè)unsafe類(lèi)型的ByteBuf, 比如PooledUnsafeHeapByteBuf或者PooledUnsafeDirectByteBuf

以PooledUnsafeHeapByteBuf的_getByte方法為例:

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

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

有關(guān)AbstractByteBuf的主要實(shí)現(xiàn)類(lèi)和繼承關(guān)系, 如下圖所示:

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

相關(guān)文章

  • Java單例模式利用HashMap實(shí)現(xiàn)緩存數(shù)據(jù)

    Java單例模式利用HashMap實(shí)現(xiàn)緩存數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了Java單例模式利用HashMap實(shí)現(xiàn)緩存數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Redis集群原理詳細(xì)分析

    Redis集群原理詳細(xì)分析

    Redis集群實(shí)現(xiàn)了對(duì)Redis的水平擴(kuò)容,即啟動(dòng)N個(gè)redis節(jié)點(diǎn),將整個(gè)數(shù)據(jù)庫(kù)分布存儲(chǔ)在這N個(gè)節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)存儲(chǔ)總數(shù)據(jù)的1/N。Redis集群通過(guò)分區(qū)來(lái)提供一定程度的可用,即使集群中有一部分節(jié)點(diǎn)失效或者無(wú)法進(jìn)行通訊,集群也可以繼續(xù)處理命令請(qǐng)求
    2022-12-12
  • SpringMvc中容器加載的過(guò)程源碼詳解

    SpringMvc中容器加載的過(guò)程源碼詳解

    這篇文章主要介紹了SpringMvc中容器加載的過(guò)程源碼詳解,springmvc是基于spring的一個(gè)web層框架,同樣也是web層框架的有struts,struts2等等,但是struts因?yàn)槁┒吹葐?wèn)題,被慢慢淘汰了,現(xiàn)在基本都在用springmvc,需要的朋友可以參考下
    2023-11-11
  • SpringBoot啟動(dòng)流程入口參數(shù)創(chuàng)建對(duì)象源碼分析

    SpringBoot啟動(dòng)流程入口參數(shù)創(chuàng)建對(duì)象源碼分析

    這篇文章主要為大家介紹了SpringBoot啟動(dòng)流程入口參數(shù)研究及創(chuàng)建對(duì)象源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • springboot AutoConfigureAfter控制Bean的注入順序方法詳解

    springboot AutoConfigureAfter控制Bean的注入順序方法詳解

    這個(gè)文章主要介紹一下@AutoConfigureAfter在spring框架中的作用,在使用過(guò)程中,很多開(kāi)發(fā)人員在使用它的時(shí)候都出現(xiàn)了問(wèn)題,問(wèn)題比較多的就是它們的注冊(cè)順序總不是我們預(yù)期的,下面介紹一下正常的使用方法,感興趣的朋友一起看看吧
    2024-05-05
  • 快速解決idea打開(kāi)某個(gè)項(xiàng)目卡住的問(wèn)題

    快速解決idea打開(kāi)某個(gè)項(xiàng)目卡住的問(wèn)題

    這篇文章主要介紹了解決idea打開(kāi)某個(gè)項(xiàng)目卡住的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java中BCryptPasswordEncoder密碼的加密與驗(yàn)證方式

    java中BCryptPasswordEncoder密碼的加密與驗(yàn)證方式

    這篇文章主要介紹了java中BCryptPasswordEncoder密碼的加密與驗(yàn)證方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式

    Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式

    這篇文章主要為大家詳細(xì)介紹了Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • SpringBoot項(xiàng)目中自定義Banner的技術(shù)指南

    SpringBoot項(xiàng)目中自定義Banner的技術(shù)指南

    在 Spring Boot 項(xiàng)目中,當(dāng)應(yīng)用啟動(dòng)時(shí)會(huì)顯示默認(rèn)的 Spring 標(biāo)志和版本信息,定制化的啟動(dòng) Banner 不僅可以美化應(yīng)用,甚至可以提供一些關(guān)鍵信息,本文將介紹如何在 Spring Boot 項(xiàng)目中自定義啟動(dòng) Banner,需要的朋友可以參考下
    2025-03-03
  • 使用jackson實(shí)現(xiàn)對(duì)象json之間的相互轉(zhuǎn)換(spring boot)

    使用jackson實(shí)現(xiàn)對(duì)象json之間的相互轉(zhuǎn)換(spring boot)

    這篇文章主要介紹了使用jackson實(shí)現(xiàn)對(duì)象json之間的相互轉(zhuǎn)換(spring boot),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論

南召县| 马鞍山市| 三台县| 新沂市| 黄骅市| 威宁| 建平县| 信阳市| 晋城| 潼南县| 桐梓县| 合江县| 新安县| 阜阳市| 长岛县| 安达市| 巴青县| 湘乡市| 密云县| 上思县| 上高县| 富平县| 鄂伦春自治旗| 临猗县| 五莲县| 白银市| 梧州市| 张家界市| 无极县| 大田县| 都兰县| 论坛| 保德县| 连江县| 海伦市| 吐鲁番市| 河北省| 柯坪县| 家居| 普安县| 大邑县|