- Netty 的 ByteBuffer 替代品是 ByteBuf 一喘,既解決了 JDK API 的局限性茶行,又為網(wǎng)絡(luò)應(yīng)用程序的開發(fā)者提供了更好的 API梧疲。通過兩個組件
abstract class ByteBuf
和interface ByteBufHolder
暴露- 它可以被用戶自定義的緩沖區(qū)類型擴(kuò)展
- 通過內(nèi)置的復(fù)合緩沖區(qū)類型實現(xiàn)了透明的零拷貝
- 容量可以按需增長(類似于 JDK 的 StringBuilder)
- 在讀和寫這兩種模式之間切換不需要調(diào)用 ByteBuffer 的 flip()方法
- 讀和寫使用了不同的索引
- 支持方法的鏈?zhǔn)秸{(diào)用
- 支持引用計數(shù)
- 支持池化
- ByteBuf 維護(hù)了讀取和寫入索引邮丰,以 read 或 write 開頭的 ByteBuf 方法霸奕,會推進(jìn)索引,而以 set 或 get 開頭的方法不會
- ByteBuf 的使用模式
- 堆緩沖區(qū):將數(shù)據(jù)存儲在 JVM 的堆空間中她倘,作為支撐數(shù)組璧微,在沒有使用池化的情況下可快速分配和釋放
- 直接緩沖區(qū):常規(guī)的IO操作是將堆緩沖區(qū)的內(nèi)容復(fù)制到直接緩沖區(qū)中進(jìn)行IO,直接緩沖區(qū)的分配和釋放都比較昂貴硬梁,對于IO之外的操作前硫,需要將數(shù)據(jù)復(fù)制到堆中
- 復(fù)合緩沖區(qū):通過為多個 ByteBuf 提供一個聚合視圖,并且可以包含直接內(nèi)存分配和非直接內(nèi)存分配
- 派生緩沖區(qū)創(chuàng)建成本低廉和源緩沖區(qū)共享存儲內(nèi)容荧止,只是具有自己的讀屹电、寫和標(biāo)記索引,``duplicate, slice, Unpooled.unmodifiableBuffer, order, readSlice```這些方法會返回派生緩沖區(qū)跃巡,如果需要真實副本則應(yīng)該使用 copy
-
ByteBufHolder
提供了緩沖區(qū)池化等高級技術(shù)危号,content
返回這個ByteBufHolder
所持有的 ByteBuf,copy
返回這個ByteBufHolder
的一個深拷貝素邪,包括一個其所包含的 ByteBuf 的非共享拷貝外莲,duplicate
返回這個ByteBufHolder
的一個淺拷貝,包括一個其所包含的 ByteBuf 的共享拷貝 -
ByteBufAllocator
接口提供了分配 ByteBuf 的方法,在Channel
和ChannelHandlerContext
都可以獲取到ByteBufAllocator
的引用channel.alloc(); ctx.alloc();
偷线;Netty 提供了兩種ByteBufAllocator
的實現(xiàn):PooledByteBufAllocator
和UnpooledByteBufAllocator
磨确,前者池化了 ByteBuf 實例(采用jemalloc),后者非池化声邦,并且每次都會返回一個新的實例乏奥,Unpooled
工具類可用來輔助創(chuàng)建未池化的 ByteBuf 實例 -
ByteBufUtil
提供了用于操作 ByteBuf 的靜態(tài)的輔助方法(與池化無關(guān)),其中hexdump
將ByteBuf內(nèi)容以十六進(jìn)制打印亥曹,equals
用來判斷兩個 ByteBuf 實例的相等性 - Netty 在第4版中為 ByteBuf 和 ByteBufHolder 引入了引用計數(shù)技術(shù)邓了,都實現(xiàn)了
ReferenceCounted
接口,只要引用計數(shù)大于0媳瞪,就能保證對象不會被釋放骗炉;減少到0就會被釋放,這對于池化實現(xiàn)能降低內(nèi)存分配的開銷材失。
第 5 章 ByteBuf
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門绞铃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儿捧,“玉大人挑宠,你說我怎么就攤上這事「鞯恚” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵临谱,是天一觀的道長。 經(jīng)常有香客問我旧找,道長麦牺,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任魏颓,我火速辦了婚禮吱晒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叹话。我一直安慰自己墩瞳,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布热凹。 她就那樣靜靜地躺著泪电,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碟渺。 梳的紋絲不亂的頭發(fā)上和蚪,一...
- 文/蒼蘭香墨 我猛地睜開眼塔淤,長吁一口氣:“原來是場噩夢啊……” “哼摘昌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起高蜂,我...
- 正文 年R本政府宣布派歌,位于F島的核電站,受9級特大地震影響痰哨,放射性物質(zhì)發(fā)生泄漏胶果。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一斤斧、第九天 我趴在偏房一處隱蔽的房頂上張望早抠。 院中可真熱鬧,春花似錦撬讽、人聲如沸蕊连。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽载庭。三九已至靖榕,卻和暖如春茁计,著一層夾襖步出監(jiān)牢的瞬間星压,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 本文是Netty文集中“Netty in action”系列的文章琼了。主要是對Norman Maurer and M...
- 原文地址:http://netty.io/wiki/reference-counted-objects.html ...
- Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)盏档,斷路器凶掰,智...
- 1、Netty基礎(chǔ)入門 Netty是由JBOSS提供的一個java開源框架蜈亩。Netty提供異步的懦窘、事件驅(qū)動的網(wǎng)絡(luò)應(yīng)...