日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

面試官:說說Netty對(duì)象池的實(shí)現(xiàn)原理?

來源: 責(zé)編: 時(shí)間:2024-06-05 17:44:42 156觀看
導(dǎo)讀Netty 作為一個(gè)高性能的網(wǎng)絡(luò)通訊框架,它內(nèi)置了很多恰奪天工的設(shè)計(jì),目的都是為了將網(wǎng)絡(luò)通訊的性能做到極致,其中「對(duì)象池技術(shù)」也是實(shí)現(xiàn)這一目標(biāo)的重要技術(shù)。1.什么是對(duì)象池技術(shù)?對(duì)象池技術(shù)是一種重用對(duì)象以減少對(duì)象創(chuàng)建和

jMN28資訊網(wǎng)——每日最新資訊28at.com

Netty 作為一個(gè)高性能的網(wǎng)絡(luò)通訊框架,它內(nèi)置了很多恰奪天工的設(shè)計(jì),目的都是為了將網(wǎng)絡(luò)通訊的性能做到極致,其中「對(duì)象池技術(shù)」也是實(shí)現(xiàn)這一目標(biāo)的重要技術(shù)。jMN28資訊網(wǎng)——每日最新資訊28at.com

1.什么是對(duì)象池技術(shù)?

對(duì)象池技術(shù)是一種重用對(duì)象以減少對(duì)象創(chuàng)建和銷毀帶來的開銷的方法。在對(duì)象池中,只有第一次訪問時(shí)會(huì)創(chuàng)建對(duì)象,并將其維護(hù)在內(nèi)存中,當(dāng)再次需要使用對(duì)象時(shí),會(huì)直接從對(duì)象池中獲取對(duì)象,并在使用完畢后歸還給對(duì)象池,而不是頻繁地創(chuàng)建和銷毀對(duì)象。jMN28資訊網(wǎng)——每日最新資訊28at.com

使用對(duì)象池技術(shù)的優(yōu)點(diǎn)有以下幾個(gè):jMN28資訊網(wǎng)——每日最新資訊28at.com

  • 提高性能:復(fù)用對(duì)象可以減少對(duì)象的創(chuàng)建和銷毀次數(shù),降低系統(tǒng)開銷,提高系統(tǒng)性能和吞吐量。
  • 減少內(nèi)存碎片:對(duì)象池可以避免頻繁地創(chuàng)建和銷毀對(duì)象,減少內(nèi)存碎片的產(chǎn)生,提高內(nèi)存利用率。
  • 避免頻繁GC:減少了對(duì)象的創(chuàng)建和銷毀,可以減少垃圾回收(GC)的頻率,降低系統(tǒng)的負(fù)擔(dān),提高系統(tǒng)的穩(wěn)定性。

2.對(duì)象池基本使用

Netty 對(duì)象池技術(shù)的核心實(shí)現(xiàn)類為 Recycler,Recycler 主要提供了以下 3 個(gè)方法:jMN28資訊網(wǎng)——每日最新資訊28at.com

  • get():獲取一個(gè)可重復(fù)使用的對(duì)象,如果對(duì)象池中有空閑對(duì)象,則返回其中一個(gè);否則會(huì)創(chuàng)建一個(gè)新對(duì)象。
  • recycle(T, Handle):回收一個(gè)對(duì)象,將對(duì)象放回對(duì)象池中以便下次復(fù)用。
  • newObject(Handle):當(dāng)對(duì)象池中沒有可用對(duì)象時(shí),此方法會(huì)被調(diào)用以創(chuàng)建新的對(duì)象實(shí)例。

接下來我們寫一個(gè) Recycler 對(duì)象池的使用 Demo,假設(shè)我們有一個(gè) User 類,需要實(shí)現(xiàn) User 對(duì)象的復(fù)用,具體實(shí)現(xiàn)代碼如下:jMN28資訊網(wǎng)——每日最新資訊28at.com

public class UserRecyclerDemo {    private static final Recycler<User> userRecycler = new Recycler<User>() {        @Override        protected User newObject(Handle<User> handle) {            return new User(handle);        }    };    static final class User {        private String name;        private Recycler.Handle<User> handle;        public void setName(String name) {            this.name = name;        }        public String getName() {            return name;        }        public User(Recycler.Handle<User> handle) {            this.handle = handle;        }        public void recycle() {            handle.recycle(this);        }    }    public static void main(String[] args) {        User user1 = userRecycler.get();  // 1.從對(duì)象池獲取 User 對(duì)象        user1.setName("zhangsan");    // 2.設(shè)置 User 對(duì)象的屬性        user1.recycle();      // 3.回收對(duì)象到對(duì)象池        User user2 = userRecycler.get();  // 4.從對(duì)象池獲取對(duì)象        System.out.println(user1 == user2);        System.out.println(user2.getName());    }}

以上程序的執(zhí)行結(jié)果如下:jMN28資訊網(wǎng)——每日最新資訊28at.com

truejMN28資訊網(wǎng)——每日最新資訊28at.com

zhangsanjMN28資訊網(wǎng)——每日最新資訊28at.com

從上述結(jié)果可以看出,當(dāng)?shù)谝淮握{(diào)用 userRecycler.get() 時(shí),因?yàn)閷?duì)象池中尚未存在 user 對(duì)象,所以創(chuàng)建了 name 為“zhangsan”的對(duì)象。但第二次再調(diào)用 userRecycler.get() 時(shí),因?yàn)閷?duì)象池中已經(jīng)存在了 user 對(duì)象,所以直接從對(duì)象池中取出了 user 對(duì)象,所以 user1==user2 時(shí),得到的結(jié)果是 true。jMN28資訊網(wǎng)——每日最新資訊28at.com

3.對(duì)象池技術(shù)應(yīng)用

在 Netty 中,使用 Recycler 對(duì)象池管理對(duì)象的常見類有以下幾個(gè):jMN28資訊網(wǎng)——每日最新資訊28at.com

  • PooledHeapByteBuf:管理堆內(nèi)存中的 ByteBuf 對(duì)象。
  • PooledDirectByteBuf:管理堆外內(nèi)存中的 ByteBuf 對(duì)象。
  • ChannelOutboundBuffer.Entry:Netty 出站緩沖區(qū)(ChannelOutboundBuffer)中,每一個(gè)待發(fā)送的消息都包裝在一個(gè) Entry 對(duì)象中。

4.實(shí)現(xiàn)原理

要搞清楚 Netty 對(duì)象池技術(shù)的實(shí)現(xiàn)原理,就要搞清楚 Netty 對(duì)象池的核心組件,以及組件之間的關(guān)系。jMN28資訊網(wǎng)——每日最新資訊28at.com

Netty 對(duì)象池技術(shù)的實(shí)現(xiàn)依靠以下 4 大組件:jMN28資訊網(wǎng)——每日最新資訊28at.com

  • Stack(棧):每個(gè)線程都關(guān)聯(lián)一個(gè) Stack(使用 FastThreadLocal 進(jìn)行存儲(chǔ)),用于存儲(chǔ)和管理該線程回收的對(duì)象。Stack 中存儲(chǔ)的是 DefaultHandle 對(duì)象,這些 DefaultHandle 對(duì)象包裝了實(shí)際要重用的對(duì)象。Stack 是與線程綁定的,每個(gè)線程從自己的 Stack 中獲取對(duì)象。
  • WeakOrderQueue(弱序隊(duì)列):當(dāng)某個(gè)線程(非主線程)回收對(duì)象時(shí),這些對(duì)象不會(huì)直接放入主線程的 Stack 中,而是放入 WeakOrderQueue 中。WeakOrderQueue 存儲(chǔ)的是從其他線程回收的對(duì)象,這些對(duì)象被包裝在 DefaultHandle 中。WeakOrderQueue 與 Stack 關(guān)聯(lián),但屬于非主線程。當(dāng)主線程的 Stack 為空時(shí),會(huì)嘗試從 WeakOrderQueue 中獲取對(duì)象。
  • Link(鏈表):WeakOrderQueue 中的存儲(chǔ)單元,用于存儲(chǔ)回收的對(duì)象。Link 中存儲(chǔ)的是 DefaultHandle 對(duì)象數(shù)組,這些數(shù)組包含從其他線程回收的對(duì)象。
  • DefaultHandle:對(duì)象的包裝類,在 Recycler 中緩存的對(duì)象都會(huì)包裝成 DefaultHandle 類。DefaultHandle 中存儲(chǔ)了實(shí)際要重用的對(duì)象,以及與之相關(guān)的元數(shù)據(jù)。

簡(jiǎn)單來說,這 4 個(gè)組件的關(guān)系是,(每個(gè))線程為了保證線程安全和高效性操作,所以會(huì)把使用的對(duì)象放到 Stack 棧中,且每個(gè)線程都有自己的 Stack 棧。當(dāng)線程中的對(duì)象不再被使用時(shí)(也就是被回收時(shí)),并不會(huì)將回收對(duì)象直接放到 Stack 中(因?yàn)楫?dāng)前線程已經(jīng)不再使用了),此時(shí)會(huì)將對(duì)象存放到 WeakOrderQueue 隊(duì)列中,因?yàn)?WeakOrderQueue 隊(duì)列相當(dāng)于“線程共享的區(qū)域”,這樣其他線程就可以方便的從 WeakOrderQueue 中獲取對(duì)象進(jìn)行重用了。而 WeakOrderQueue 中的存儲(chǔ)單元是 Link 鏈表,它存儲(chǔ)的是對(duì)象池中的包裝對(duì)象 DefaultHandle,這就是這四大核心組件之間的關(guān)系。jMN28資訊網(wǎng)——每日最新資訊28at.com

5.線程如何獲取對(duì)象?

在 Netty 中,獲取對(duì)象池中對(duì)象的流程如下:jMN28資訊網(wǎng)——每日最新資訊28at.com

  • 判斷 Stack:線程首先會(huì)嘗試從自己的 Stack 中獲取對(duì)象。如果 Stack 中有對(duì)象,則直接彈出(pop)并返回。
  • Stack 為空:如果 Stack 為空,線程會(huì)檢查 WeakOrderQueue。如果 WeakOrderQueue 中有對(duì)象,則按照一定的規(guī)則(如“1/7規(guī)則”,每 7 個(gè)移動(dòng) 1 個(gè))將部分對(duì)象轉(zhuǎn)移到 Stack 中,然后從 Stack 中彈出并返回。
  • 創(chuàng)建新對(duì)象:如果 Stack 和 WeakOrderQueue 都為空,線程會(huì)調(diào)用 newObject() 方法創(chuàng)建一個(gè)新的對(duì)象,并包裝成 DefaultHandle 后放入 Stack 中,然后返回該對(duì)象。

通過這樣的設(shè)計(jì),Netty 的 Recycler 對(duì)象池技術(shù)能夠高效地重用對(duì)象,減少內(nèi)存分配和垃圾收集的開銷,提升性能。jMN28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-92142-0.html面試官:說說Netty對(duì)象池的實(shí)現(xiàn)原理?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Python性能加速器:深度解析__slots__屬性優(yōu)化內(nèi)存利用!

下一篇: 2024 年你可以使用的十大 Node.js 現(xiàn)代特性

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 紅魔電競(jìng)平板評(píng)測(cè):大屏幕硬實(shí)力

    前言:三年的疫情因?yàn)橐暇W(wǎng)課的原因激活了平板市場(chǎng),如今網(wǎng)課的時(shí)代已經(jīng)過去,大家的生活都恢復(fù)到了正軌,這也就意味著,真正考驗(yàn)平板電腦生存的環(huán)境來了。也就是面對(duì)著這種殘酷的
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學(xué)習(xí)反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對(duì)代碼進(jìn)行反混淆,尤其是使用自定義混淆器對(duì)其進(jìn)行混淆時(shí)。什么是混
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對(duì)Reader和Writer接口的組合,
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個(gè)月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當(dāng)時(shí)用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 微軟邀請(qǐng) Microsoft 365 商業(yè)用戶,測(cè)試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業(yè)用戶,開放 Clipchamp 應(yīng)用,邀請(qǐng)用戶通過該應(yīng)用來編輯視頻。微軟于 2021 年收購(gòu) Clipchamp,隨后開始逐步整合到 Microsof
  • 小紅書1周漲粉49W+,我總結(jié)了小白可以用的N條漲粉筆記

    作者:黃河懂運(yùn)營(yíng)一條性教育視頻,被54萬(wàn)人&ldquo;珍藏&rdquo;是什么體驗(yàn)?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬(wàn)人,為她瘋狂點(diǎn)贊!更瘋狂的是,這
  • 梁柱接棒兩年,騰訊音樂闖出新路子

    文丨田靜 出品丨牛刀財(cái)經(jīng)(niudaocaijing)7月5日,企鵝FM發(fā)布官方公告稱由于業(yè)務(wù)調(diào)整,將于9月6日正式停止運(yùn)營(yíng),這意味著騰訊音樂長(zhǎng)音頻業(yè)務(wù)走向消亡。騰訊在長(zhǎng)音頻領(lǐng)域還在摸索。為
  • 三星獲批量產(chǎn)iPhone 15全系屏幕:蘋果史上最驚艷直屏

    按照慣例,蘋果將繼續(xù)在今年9月舉辦一年一度的秋季新品發(fā)布會(huì),有傳言稱發(fā)布會(huì)將于9月12日舉行,屆時(shí)全新的iPhone 15系列將正式與大家見面,不出意外的話
  • 電博會(huì)與軟博會(huì)實(shí)現(xiàn)"線下+云端"的雙線融合

    在本次“電博會(huì)”與“軟博會(huì)”雙展會(huì)利好條件的加持下,既可以發(fā)揮展會(huì)拉動(dòng)人流、信息流、資金流實(shí)現(xiàn)快速交互流動(dòng)的作用,繼而推動(dòng)區(qū)域經(jīng)濟(jì)良性發(fā)展;又可以聚
Top 主站蜘蛛池模板: 伊吾县| 周至县| 弥渡县| 尼木县| 浏阳市| 姜堰市| 广元市| 元谋县| 陆川县| 竹溪县| 尚义县| 榆中县| 弥勒县| 大连市| 勐海县| 石林| 扎鲁特旗| 延长县| 饶阳县| 苍山县| 阆中市| 五华县| 龙里县| 道真| 洛扎县| 乌苏市| 当雄县| 安岳县| 桂林市| 湖南省| 长海县| 正定县| 大英县| 广昌县| 卢龙县| 恩施市| 五峰| 镇平县| 奇台县| 安泽县| 沾益县|