![vip netty核心源碼剖析_第1頁](http://file4.renrendoc.com/view/f001e0b720964944d424b1e36f6c6a91/f001e0b720964944d424b1e36f6c6a911.gif)
![vip netty核心源碼剖析_第2頁](http://file4.renrendoc.com/view/f001e0b720964944d424b1e36f6c6a91/f001e0b720964944d424b1e36f6c6a912.gif)
![vip netty核心源碼剖析_第3頁](http://file4.renrendoc.com/view/f001e0b720964944d424b1e36f6c6a91/f001e0b720964944d424b1e36f6c6a913.gif)
![vip netty核心源碼剖析_第4頁](http://file4.renrendoc.com/view/f001e0b720964944d424b1e36f6c6a91/f001e0b720964944d424b1e36f6c6a914.gif)
![vip netty核心源碼剖析_第5頁](http://file4.renrendoc.com/view/f001e0b720964944d424b1e36f6c6a91/f001e0b720964944d424b1e36f6c6a915.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
3畫圖做筆記:邊看源碼邊畫源碼走向圖,并對關(guān)鍵源碼的理解做筆記,把源碼里的閃光點都記錄下來,后續(xù)借鑒到工作項目中,理解能力強的可以直接看靜態(tài)源碼,也可以邊看源碼邊debug在大多數(shù)場景下,并行多線程處理可以提升系統(tǒng)的并發(fā)性能。但是,如果對于共享資源的并發(fā)訪問處理不當(dāng),會帶來嚴(yán)重的鎖競爭,這最終會導(dǎo)致性能的下降。為了盡可能的避免鎖競爭帶來的性能損耗,可以通過串行化設(shè)計,即消息的處理盡可能在同一個線程內(nèi)完成,期間不進(jìn)行線程切換,這樣就避免了多線程競爭和同步鎖。IO的多路復(fù)用就是一種無鎖串行化的設(shè)計思想(理解下Reds和etty的線程模型)為了盡可能提升性能,etty采用了串行無鎖化設(shè)計,在O線程內(nèi)部進(jìn)行串行操作,避免多線程競爭導(dǎo)致的性能下降。表面上看,串行化設(shè)計似乎CPU利用率不高,并發(fā)程度不夠。但是,通過調(diào)整NIO線程池的線程參數(shù),可以同時啟動多個串行化的線程并行運行,這種局部 的NioEventLoop讀取到消息之后,直接調(diào)用ChannelPipeline的fireChannelRead(Objectmsg),只要用戶不主動切換線程,一直會由直接內(nèi)存(DrectMemory)并不是虛擬機運行時數(shù)據(jù)區(qū)的一部分,也不是Java虛擬機規(guī)范中定義的內(nèi)存區(qū)域,某些情況下這部分內(nèi)存也會被頻繁地使用,而且也可能導(dǎo)致OutMemorrror異常出現(xiàn)。Java里用rectteuer可以分配一塊直接內(nèi)存(堆外內(nèi)存),元空間對應(yīng)的內(nèi)存也叫作直接內(nèi)存,它們對應(yīng)的都是機器的物理內(nèi)存。1publicclassDirectMemoryTest5publicstaticvoidheapAccess()longstartTime=ByteBufferbuffer=for(inti=0;i<100000;i++)for(intj=0;j<200;j++)}for(intj=0;j<200;j++)}}longendTime=System.out.println("堆內(nèi)存訪問(endTimestartTime}publicstaticvoiddirectAccess()longstartTime=ByteBufferbuffer=for(inti=0;i<100000;i++)for(intj=0;j<200;j++)}for(intj=0;j<200;j++)}}longendTime=System.out.println("直接內(nèi)存訪問(endTimestartTime)}publicstaticvoidheapAllocate()longstartTime=for(inti=0;i<100000;i++)}longendTime=System.out.println("堆內(nèi)存申請(endTimestartTime}publicstaticvoiddirectAllocate()longstartTime=for(inti=0;i<100000;i++)}longendTime=System.out.println("直接內(nèi)存申請(endTimestartTime)}publicstaticvoidmain(Stringargs[])for(inti=0;i<10;i++)}6668for(inti=0;i<10;i++)}}73直接內(nèi)存分配源碼分析11publicstaticByteBufferallocateDirect(intcapacity)372returnnew345DirectByteBuffer(intcap){//super(‐1,0,cap,booleanpa=intps=longsize=Math.max(1L,(long)cap+(pa?ps:mi//在分配直接內(nèi)存時如果發(fā)現(xiàn)空間不夠會顯示調(diào)用System.gc()觸發(fā)一次fullgc回收掉一部分無用的直接內(nèi)存的引用對象,同時直接內(nèi)存也會longbase=trybase=}catch(OutOfMemoryErrorx)throw}unsafe.setMemory(base,size,(byte)if(pa&&(base%ps!=0))//Rounduptopageaddress=base+ps‐(base&(ps‐}elseaddress=}//cleaner=Cleaner.create(this,newDeallocator(base,size,att=6262//publicnativelongallocateMemory(long//UNSAFE_ENTRY(jlong,Unsafe_AllocateMemory(JNIEnv*env,jobjectunsafe,jlongsize_tsz=if(sz!=(julong)size||size<0)}if(sz==0)return}sz=round_to(sz,//void*x=os::malloc(sz,if(x==NULL)}//Copy::fill_to_words((HeapWord*)x,sz/return
如果使用傳統(tǒng)的JVM堆內(nèi)存(HEAPBUFFERS)進(jìn)行Socket讀寫,JVM會將堆內(nèi)存Buffer拷貝一份到直接內(nèi)存中,然后才能寫入Socket隨著JVM虛擬機和JIT即時編譯技術(shù)的發(fā)展,對象的分配和回收是個非常輕量級的工作。但是對于緩沖區(qū)Buffer(相當(dāng)于一個內(nèi)存塊),情況卻稍有不同,特別是對于堆外直接內(nèi)存的分配和回收,是一件耗時的操作。為了盡量重用緩沖區(qū),Netty提供了基于ByteBufByteBuf使用即可,使用完畢之后就重新放回到池子里去。下面我們一起看下NettyBtef的實現(xiàn):代碼跳轉(zhuǎn)到PooledByteBufAllocator的newDirectBuffer方法,從Cache中獲取內(nèi)存區(qū)域PooArena,調(diào)用它的allocate配:置TC參些下能升到的例收S送區(qū)SO_SNDF置對的非的建1或6。 在啟動輔助類ChannelOption中可以靈活的配置TCP參數(shù),滿足不同的用戶場景。 閾值,為Bytebuf內(nèi)部設(shè)定容量的最大值maxCapacity:Netty最大進(jìn)入ByteBuf源碼中,深入分析其擴容方法:idea源碼進(jìn)入:ByteBuf.writeByte()-總結(jié):Netty的ByteBuf需要動態(tài)擴容來滿足需要,擴容過程:默認(rèn)門限閾值為4MB(這個閾值是一個經(jīng)驗值,不同場景,可能取值不同),當(dāng)需要的容量等于門限閾值,使用閾值作為新的緩存區(qū)容量目標(biāo)容量,如果大于閾值,采用每次步進(jìn)4MB的方式進(jìn)行maxCapacity,否則使用擴容值目標(biāo)容量,如果小于閾值,采用倍增的方式,以64(字節(jié))作為基本數(shù)值,每次翻倍增長64-->128256,1119publicvoidchannelRegistered(ChannelHandlerContext2*handler的生命周期回調(diào)接口調(diào)用順序*handlerAdded‐>channelRegistered‐>channelActive‐>channelRead‐>*‐>channelInactive‐>channelUnRegistered‐>**handlerAdded新建立的連接會按照初始化策略,把handler添加到該channel的pipeline里面,也就是channel.pipeline.addLast(new:*ee:::對應(yīng)publicclassLifeCycleInBoundHandlerextendsChannelInboundHandlerAdapterthrowsException:}publicvoidchannelUnregistered(ChannelHandlerContextthrowsException:}publicvoidchannelActive(ChannelHandlerContextthrowsException:}publicvoidchannelInactive(ChannelHandlerContextthrowsException:}publicvoidchannelRead(ChannelHandlerContextctx,ObjectthrowsException:");}publicvoidchanne
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文化場館停車場改造協(xié)議
- 主題餐廳裝修分包合同模板
- 4S店裝修補貼合同協(xié)議
- 寵物店裝修合同標(biāo)準(zhǔn)格式
- 展覽館裝修終止合同協(xié)議書
- 游輪衛(wèi)生間裝修合同標(biāo)準(zhǔn)
- 工程項目材料運輸合同
- 廣告?zhèn)髅骄娱g服務(wù)協(xié)議
- 無人機領(lǐng)域股權(quán)居間合同
- 達(dá)州市聯(lián)考高一數(shù)學(xué)試卷
- GB/T 8014.1-2005鋁及鋁合金陽極氧化氧化膜厚度的測量方法第1部分:測量原則
- 股票基礎(chǔ)知識(入市必讀)-PPT
- eNSP簡介及操作課件
- 公文與公文寫作課件
- 運動技能學(xué)習(xí)與控制課件第七章運動技能的協(xié)調(diào)控制
- 節(jié)后復(fù)工吊籃驗收表格
- 基于振動信號的齒輪故障診斷方法研究
- 醫(yī)療器械分類目錄2002版
- DB11_T1713-2020 城市綜合管廊工程資料管理規(guī)程
- 氣管套管滑脫急救知識分享
- 壓縮空氣系統(tǒng)管道阻力計算
評論
0/150
提交評論