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

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

.Net GC從空閑列表里面分配對象

來源: 責(zé)編: 時間:2023-09-28 10:08:00 285觀看
導(dǎo)讀1.前言空閑列表(free_list)實質(zhì)上是GC經(jīng)過垃圾回收之后形成的碎片空間,它的空間可以進(jìn)行重新分配新的對象。本篇看下它的重新分配過程。2.概述當(dāng)進(jìn)行一個對象分配的時候,如果是慢速分配(JIT_New)的時候,它會查找空閑列表

1.前言

空閑列表(free_list)實質(zhì)上是GC經(jīng)過垃圾回收之后形成的碎片空間,它的空間可以進(jìn)行重新分配新的對象。本篇看下它的重新分配過程。O8U28資訊網(wǎng)——每日最新資訊28at.com

2.概述

當(dāng)進(jìn)行一個對象分配的時候,如果是慢速分配(JIT_New)的時候,它會查找空閑列表里面是否有足夠的空間來分配這個對象。如果有就把這個對象放到空閑列表里面去。O8U28資訊網(wǎng)——每日最新資訊28at.com

CLR堆棧如下:O8U28資訊網(wǎng)——每日最新資訊28at.com

>  WKS::gc_heap::a_fit_free_list_p  C++   WKS::gc_heap::soh_try_fit  C++   WKS::gc_heap::allocate_soh  C++   WKS::gc_heap::try_allocate_more_space  C++   WKS::gc_heap::allocate_more_space  C++   WKS::gc_heap::allocate  C++   WKS::GCHeap::Alloc  C++   Alloc  C++   AllocateObject  C++   JIT_New  C++//此處省略一萬行   RtlUserThreadStart()  未知

著重看下這個a_fit_free_list_p函數(shù),它就是進(jìn)行空閑列表分配,關(guān)鍵代碼如下:O8U28資訊網(wǎng)——每日最新資訊28at.com

BOOL gc_heap::a_fit_free_list_p (int gen_number,                                 size_t size,                                 alloc_context* acontext,                                 uint32_t flags,                                 int align_const){    BOOL can_fit = FALSE;    //獲取當(dāng)前收集代地址    generation* gen = generation_of (gen_number);    //獲取當(dāng)前收集代 空閑列表一直    allocator* gen_allocator = generation_allocator (gen);    //遍歷冫空閑列表里面的bucket,找到何時的空間存儲對象    for (unsigned int a_l_idx = gen_allocator->first_suitable_bucket(size); a_l_idx < gen_allocator->number_of_buckets(); a_l_idx++)    {        //索引的空閑列表的頭部指針        uint8_t* free_list = gen_allocator->alloc_list_head_of (a_l_idx);        uint8_t* prev_free_item = 0;        //如果獲取到的空閑列表空間不為0        while (free_list != 0)        {            //獲取當(dāng)前索引空閑了free_list里面bucket的長度            size_t free_list_size = unused_array_size (free_list);           //如果需要分配對象長度小于free_lis里面獲取的長度,那么表示對象可以放入空閑列表            if ((size + Align (min_obj_size, align_const)) <= free_list_size)            {                //unlink,斷開鏈接。意思是從空閑列表里面把空間拿出來,因為它操作的是鏈表。                // 把獲取到的free_lsit的bucket長度從free_lsit鏈表里面拿掉,也就是個鏈表操作                gen_allocator->unlink_item (a_l_idx, free_list, prev_free_item, FALSE);                //計算出對象需要的空間也就是參數(shù)size,最終需要分配的長度                size_t limit = limit_from_size (size, flags, free_list_size, gen_number, align_const);                //收集代靜態(tài)數(shù)據(jù)new_allocation減去對象最終分配空間大小                dd_new_allocation (dynamic_data_of (gen_number)) -= limit;                //空閑列表頭部指針+對象占用空間大小,指向的是剩余的空間地址                uint8_t*  remain = (free_list + limit);                // 當(dāng)前代的空閑列表大小減去分配對象的大小,剩余值remain_size                size_t remain_size = (free_list_size - limit);                //如果剩余值,大于或者等于一個空閑列表的大小                if (remain_size >= Align(min_free_list, align_const))                {                   //重新把它作為空閑列表,放入free_list的bucket里面去                    make_unused_array (remain, remain_size);                    gen_allocator->thread_item_front (remain, remain_size);                    assert (remain_size >= Align (min_obj_size, align_const));                }                else  //如果剩余值小于                {                    //這里直接把剩余值給分配對象大小得了,也就是上面計算的分配對象大小+剩余的空間                    limit += remain_size;                }                //代的空閑空間減去對象需要的空間                 generation_free_list_space (gen) -= limit;                assert ((ptrdiff_t)generation_free_list_space (gen) >= 0);                //把a(bǔ)lloc_context指向計算的空間,對象就分配到alloc_context指向的地址                adjust_limit_clr (free_list, limit, size, acontext, flags, 0, align_const, gen_number);                can_fit = TRUE;                goto end;            }                 }    }end:    return can_fit;}

以上整體的思路是O8U28資訊網(wǎng)——每日最新資訊28at.com

1.先找到當(dāng)前垃圾回收的代
2.通過這個代找到次代的空閑列表
3.遍歷循環(huán)空閑列表里的number_of_buckets,以找到合適的空間放置需要分配的對象
4.如果找到了此空間,就設(shè)置alloc_context指向此空間。對象分配就通過alloc_context來分配。O8U28資訊網(wǎng)——每日最新資訊28at.com

它這個整體上是操作空閑列表管理類,然后通過空閑列表管理類給對象分配空間。O8U28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-11847-0.html.Net GC從空閑列表里面分配對象

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

上一篇: 深度使用了下 Serverless,太絲滑了!

下一篇: 圖文并茂解釋 Java JVM、JRE 和 JDK

標(biāo)簽:
  • 熱門焦點
  • K60至尊版剛預(yù)熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛?cè)缁鹑巛钡男麄髁薑60 Ultra的各種技術(shù)和硬件配置,作為競品的一加也坐不住了。一加中國區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • K60至尊版狂暴引擎2.0加持:超177萬跑分?jǐn)孬@性能第一

    Redmi的后性能時代戰(zhàn)略發(fā)布會今天下午如期舉辦,在本次發(fā)布會上,Redmi公布了多項關(guān)于和聯(lián)發(fā)科的深度合作,以及新機(jī)K60 Ultra在軟件和硬件方面的特性,例如:“K60 至尊版,雙芯旗艦
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機(jī)基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據(jù)博主數(shù)碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 5月iOS設(shè)備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發(fā)布的iOS設(shè)備性能榜的上榜設(shè)備并沒有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動,剛剛開始的蘋果WWDC2023,推出的產(chǎn)品也依舊是新款Mac Pro、新款Mac Stu
  • 女孩租房開2小時空調(diào)用完100元電費引熱議:5級能耗惹不起 月薪過萬電費也交不起

    近日,江蘇蘇州一女孩租房當(dāng)天充值了100元電費,開著空調(diào)不到2小時發(fā)現(xiàn)電費已用完。對于為什么這個快,房東表示,電表壞了這種情況很多,之前也遇到過,給租客換
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務(wù),包括但不限于:開發(fā)某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • “又被陳思誠騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國產(chǎn)懸疑電影,成了陳思誠的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠再度風(fēng)頭無兩。你可以說陳思誠的
  • 華為發(fā)布HarmonyOS 4:更好玩、更流暢、更安全

    在8月4日的華為開發(fā)者大會2023(HDC.Together)大會上,HarmonyOS 4正式發(fā)布。自2019年發(fā)布以來,HarmonyOS一直以用戶為中心,經(jīng)歷四年多的發(fā)展HarmonyOS已
  • 三星顯示已開始為AR設(shè)備研發(fā)硅基LED微顯示屏

    7月18日消息,據(jù)外媒報道,隨著蘋果首款頭顯產(chǎn)品Vision Pro在6月份正式推出,AR/VR/MR等頭顯產(chǎn)品也就將成為各大公司下一個重要的競爭領(lǐng)域,對顯示屏這一關(guān)
Top 主站蜘蛛池模板: 磴口县| 五常市| 商水县| 措美县| 兴安盟| 临安市| 什邡市| 舞阳县| 武平县| 张北县| 永善县| 铅山县| 平湖市| 平凉市| 南平市| 陵川县| 潮州市| 介休市| 黎城县| 乌拉特后旗| 六枝特区| 呼玛县| 济宁市| 深泽县| 奈曼旗| 乐安县| 漯河市| 公主岭市| 蛟河市| 顺平县| 凤台县| 西乌珠穆沁旗| 庆云县| 大渡口区| 焦作市| 依安县| 合肥市| 广西| 鱼台县| 维西| 新丰县|