日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

一文學習Java NIO的ByteBuffer工作原理

瀏覽:28日期:2022-08-11 15:12:28
目錄1 API2 Netty 的數據容器2.1 工作原理內存池化非池化的堆內與堆外的 ByteBuf池化的堆內與堆外的 ByteBuf字節級操作派生緩沖區slice、slice(int, int)、retainedSlice、retainedSlice(int, int)duplicate、retainedDuplicatereadSlice、readRetainedSlice

網絡數據的基本單位永遠是 byte(字節)。Java NIO 提供 ByteBuffer 作為字節的容器,但該類過于復雜,有點難用。

ByteBuf是Netty當中的最重要的工具類,它與JDK的ByteBuffer原理基本上相同,也分為堆內與堆外倆種類型,但是ByteBuf做了極大的優化,具有更簡單的API,更多的工具方法和優秀的內存池設計。

1 API

Netty 的數據處理 API 通過兩個組件暴露——抽象類ByteBuf 和 接口 ByteBufHolder。

ByteBuf API 的優點:

它可以被用戶自定義的緩沖區類型擴展 通過內置的復合緩沖區類型實現了透明的零拷貝; 容量可以按需增長(類似于 JDK 的 StringBuilder) 在讀和寫這兩種模式之間切換不需要調用 ByteBuffer 的 flip()方法 讀和寫使用了不同的索引 支持方法的鏈式調用 支持引用計數 支持池化

其他類可用于管理 ByteBuf 實例的分配,以及執行各種針對于數據容器本身和它所持有的數據的操作。

2 Netty 的數據容器

所有網絡通信最終都是基于底層的字節流傳輸,因此高效、方便、易用的數據接口是迷人的,而 Netty 的 ByteBuf 生而為滿足這些需求。

2.1 工作原理

ByteBuf 維護倆不同索引:一個用于讀取,一個用于寫入:

從 ByteBuf 讀取時,其 readerIndex 將會被遞增已經被讀取的字節數 當寫入 ByteBuf 時,writerIndex 也會被遞增 一個讀索引和寫索引都設置為 0 的 16 字節 ByteBuf

一文學習Java NIO的ByteBuffer工作原理一文學習Java NIO的ByteBuffer工作原理

這些索引兩兩之間有什么關系呢?若打算讀取字節直到 readerIndex == writerIndex,會發生啥?此時,將會到達“可讀取的”數據的末尾。類似試圖讀取超出數組末尾的數據一樣,試圖讀取超出該點的數據也會拋 IndexOutOfBoundsException。

一文學習Java NIO的ByteBuffer工作原理

read、write 開頭的 ByteBuf 方法,會推進對應索引 set、get 開頭的操作則不會。后面的這些方法將在作為一個參數傳入的一個相對索引上執行操作

可指定 ByteBuf 的最大容量。試圖移動寫索引(即 writerIndex)超過這個值將會觸發一個異常。(默認限制 Integer.MAX_VALUE。)

內存池化非池化的堆內與堆外的 ByteBuf

示意圖

一文學習Java NIO的ByteBuffer工作原理

ByteBuf heapBuffer = UnpooledByteBufAllocator.DEFAULT.heapBuffer(10);ByteBuf directBuffer = UnpooledByteBufAllocator.DEFAULT.directBuffer(10);

注意要手動將GC 無法控制的非堆內存的空間釋放:

池化的堆內與堆外的 ByteBuf

示意圖

一文學習Java NIO的ByteBuffer工作原理

一文學習Java NIO的ByteBuffer工作原理

字節級操作派生緩沖區

派生緩沖區為 ByteBuf 提供了以專門的方式來呈現其內容的視圖。這類視圖通過以下方法創建:

Unpooled.unmodifiableBuffer(…) order(ByteOrder) readSlice(int)

這些方法都將返回一個新的 ByteBuf 實例,但都具有自己獨立的讀、寫和標記索引。其內部存儲和 JDK 的 ByteBuffer 一樣,都是共享的。所以派生緩沖區的創建成本很低,但同時也表明若你修改了它的內容,也會同時修改對應源實例!

slice、slice(int, int)、retainedSlice、retainedSlice(int, int)

返回此緩沖區的可讀字節的一部分。此方法與buf.slice(buf.readerIndex(), buf.readableBytes())相同。該方法不會調用retain(),引用計數不會增加。retainedSlice系列方法調用類似slice().retain(),但此方法可能返回產生較少垃圾的緩沖區實現。

一文學習Java NIO的ByteBuffer工作原理

duplicate、retainedDuplicate

一文學習Java NIO的ByteBuffer工作原理

返回一個共享該緩沖區整個區域的緩沖區。此方法不會修改此緩沖區的readerIndex或writerIndex

一文學習Java NIO的ByteBuffer工作原理

讀取器和寫入器標記將不會重復。duplicate不會調用retain(),不會增加引用計數,而retainedDuplicate會。

readSlice、readRetainedSlice

一文學習Java NIO的ByteBuffer工作原理

返回部分空間,彼此共享底層緩沖區,會增加原緩沖區的readerIndex。

如果需要一個現有緩沖區的真實副本,請使用 copy()或者 copy(int, int),因為這個調用所返回的 ByteBuf 擁有獨立的數據副本。

引用與釋放

ByteBuf 在使用完畢后一定要記得釋放,否則會造成內存泄露。

引用計數

通過在某個對象所持有的資源不再被其他對象引用時釋放該對象所持有的資源來優化內存使用和性能的技術。Netty 在4.x為 ByteBuf 和 ByteBufHolder 帶來了引用計數技術,都實現了:

ReferenceCounted接口

需要顯式釋放的引用計數對象。

當一個新的ReferenceCounted被實例化時,以1 作為初始值。

retain()

增加引用計數,將引用計數加1。只要引用計數>0,就能保證對象不會被釋放。

release()

減少引用計數,將引用計數減1。若引用計數減少到0 ,對象將被顯式釋放,并且訪問釋放的對象通常會導致訪問沖突。

若實現ReferenceCounted的對象是其他實現ReferenceCounted的對象的容器,則當容器的引用計數變為 0 時,所包含的對象也將通過release()被釋放。

引用計數對于池化實現(如 PooledByteBufAllocator)很重要,它降低了內存分配的開銷。

Channel channel = ...;// 從 Channel 獲取 ByteBufAllocatorByteBufAllocator allocator = channel.alloc();...// 從 ByteBufAllocator 分配一個 ByteBufByteBuf buffer = allocator.directBuffer();// 檢查引用計數是否為預期的 1assert buffer.refCnt() == 1;ByteBuf buffer = ...;// 減少該對象的活動引用。當減少到 0 時,該對象被釋放,該方法返回 trueboolean released = buffer.release();

試圖訪問一個已經被釋放的引用計數的對象,將會拋IllegalReferenceCountException

一文學習Java NIO的ByteBuffer工作原理

一文學習Java NIO的ByteBuffer工作原理

一個特定的(ReferenceCounted 的實現)類,可以用它自己的獨特方式來定義它的引用計數規則。例如可以設想一個類,其 release()方法的實現總是將引用計數設為零,而不用關心它的當前值,從而一次性使所有的活動引用都失效。

誰負責釋放

一般由最后訪問(引用計數)對象的那一方來負責將它釋放。

以上就是一文學習Java NIO的ByteBuffer工作原理的詳細內容,更多關于Java NIO的ByteBuffer的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
先锋影音国产一区| 日韩av网站在线免费观看| 国产精品一区2区3区| 综合日韩在线| 奇米狠狠一区二区三区| 91精品丝袜国产高跟在线| 青青青国产精品| 国产情侣久久| 麻豆视频一区二区| 国产精品一卡| 国产成人精品一区二区三区免费| 中文字幕人成乱码在线观看| 午夜av成人| 黄色亚洲免费| 亚洲精品国产精品粉嫩| 国产三级一区| 欧美丰满日韩| 国产真实久久| 午夜在线播放视频欧美| 日韩av黄色在线| 麻豆视频一区| 久久在线免费| 亚洲久草在线| 国产精品videossex| 精品一级视频| 视频二区不卡| 男女激情视频一区| 国产精品亚洲综合色区韩国| 国产黄大片在线观看| 免费观看久久av| 亚洲精品看片| 国产一区二区三区亚洲综合| 性欧美69xoxoxoxo| 日韩av一二三| 欧美香蕉视频| 日韩专区一卡二卡| 国产精品视频一区二区三区| 成人小电影网站| 国产一级久久| 日本在线不卡视频一二三区| 久久97视频| 一区在线免费观看| 日韩福利在线观看| 亚洲啊v在线| 亚洲tv在线| 国产一区二区三区不卡视频网站 | 日韩午夜一区| 国产精品三p一区二区| 欧美二三四区| 午夜亚洲福利| 日韩88av| 蜜桃av一区二区三区电影| 欧美国产日本| 免费久久99精品国产自在现线| 美女高潮久久久| 91精品91| 久久久精品国产**网站| 99国产精品视频免费观看一公开| 国产福利一区二区精品秒拍 | 日韩精品首页| 奇米777国产一区国产二区| 福利在线一区| 好看不卡的中文字幕| 国产精品二区影院| 欧美日韩国产综合网| 国产精品资源| 视频在线在亚洲| jizzjizz中国精品麻豆| 日韩一区二区三区精品| 久久久五月天| 国产精品美女午夜爽爽| 日韩视频精品在线观看| 丁香婷婷久久| 日韩av在线免费观看不卡| 亚洲高清久久| 国产一区二区三区四区二区| 视频一区二区中文字幕| 精品国产免费人成网站| 欧美一级全黄| 日韩精品一级中文字幕精品视频免费观看 | 久久精品一区二区国产| 亚洲欧美日韩国产| 伊人久久在线| 国产日韩一区二区三区在线 | 中文字幕在线视频久| 欧美视频精品全部免费观看| 在线午夜精品| 四虎884aa成人精品最新| 国产精品一区二区精品视频观看| 尤物在线精品| 丝袜美腿一区| 国产中文欧美日韩在线| 国产麻豆精品久久| 亚洲区欧美区| 亚洲综合三区| 天堂资源在线亚洲| 97精品一区二区| 欧美精品二区| 欧美亚洲tv| 亚洲视频二区| 国产麻豆综合| 视频一区中文| 成人精品亚洲| www.com.cn成人| 美女精品一区二区| 国产精品久久久久77777丨| 亚洲精选91| 在线免费观看亚洲| 快she精品国产999| 亚洲免费精品| 久久国产88| 午夜在线精品| 蜜桃视频第一区免费观看| 亚洲激情另类| 在线国产一区二区| 九九在线精品| 伊人久久亚洲热| 欧美日韩免费观看一区=区三区| 91一区二区| 精品国产一级| 久久精品国产99国产| 鲁大师精品99久久久| 国产精品白丝久久av网站| 欧美一区二区三区久久精品| 日韩二区三区四区| 国产亚洲一卡2卡3卡4卡新区| 91综合久久爱com| 国产日产高清欧美一区二区三区 | 精品深夜福利视频| 久久久亚洲欧洲日产| 久久久久黄色| 国产精品13p| 日韩一区二区三区免费| 日韩三区免费| 国产一区二区三区自拍| 91精品高清| 亚洲天堂免费| 欧美伊人久久| 麻豆精品在线观看| 天堂√8在线中文| 国内精品福利| 免费黄网站欧美| 日韩综合小视频| 国产精品日韩精品中文字幕| 久久久久伊人| 欧美天堂视频| 伊人成人网在线看| 人人爽香蕉精品| 日韩av在线免费观看不卡| 欧美国产免费| 久久九九99| 爽好多水快深点欧美视频| 日韩av一二三| 久久久久久色| 91日韩欧美| 午夜久久tv| 久久精品97| 日韩精品不卡一区二区| 午夜久久福利| 欧美日韩伊人| www.51av欧美视频| 伊人久久成人| 日韩不卡在线观看日韩不卡视频 | 国产欧美一区二区精品久久久 | 久久精品国产网站| 成人羞羞视频播放网站| 久久最新视频| 毛片不卡一区二区| 91久久久精品国产| 欧美日韩xxxx| 久久久国产亚洲精品| 日日夜夜免费精品| 四虎成人av| 亚洲欧美日韩专区| 麻豆精品久久| 国产精品日本| 欧美激情在线精品一区二区三区| 亚洲香蕉网站| 久久国内精品| 91精品国产成人观看| 亚洲制服一区| 欧美国产美女| 亚洲精品伊人| 波多野结衣久久精品| 日本欧美在线看| sm捆绑调教国产免费网站在线观看 | 国产成人久久| 男女男精品网站| 亚洲天堂av影院| 日韩欧美久久| 色婷婷狠狠五月综合天色拍| 午夜性色一区二区三区免费视频| 欧美丰满日韩| 日韩黄色av| 午夜视频精品| 成人一区而且| 婷婷视频一区二区三区| 播放一区二区| 欧美亚洲福利| 日韩专区一卡二卡|