最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET?Core?GC壓縮(compact_phase)底層原理解析

 更新時(shí)間:2025年01月26日 08:59:38   作者:叫我安不理  
GC的最后一個(gè)步驟,分為清除和壓縮兩種情況,清除操作將不可到達(dá)對象轉(zhuǎn)換為Free,而壓縮操作涉及復(fù)制對象并移動(dòng)到新位置,更新所有引用,并重新劃分代邊界,本文介紹.NET Core GC壓縮原理解析,感興趣的朋友一起看看吧

簡介

終于來到了GC的最后一個(gè)步驟,在此之間,大量預(yù)備工作已經(jīng)完成。萬事俱備,只欠東風(fēng)

清除

如果GC決定不壓縮,它將僅執(zhí)行清除操作。清除操作非常簡單,把所有不可到達(dá)對象(gap),轉(zhuǎn)換成Free。也就是轉(zhuǎn)換成空閑內(nèi)存空間。由于所有的繁重計(jì)算任務(wù)在plan_phase階段均已完成,所以步驟比較簡單

基于gap的size創(chuàng)建空閑列表free > 2 * min_obj_size 的Free塊會被放入空閑列表,小于此大小的不再被利用,但會納入內(nèi)存碎片統(tǒng)計(jì)

恢復(fù)“被銷毀”的前置plug和plug這是pinned 對象的特殊情況,pinned的plug前面可能還是一個(gè)plug,所以沒有g(shù)ap來存放, 因此會根據(jù)實(shí)際情況“釘住”它的前面或者后面的Plug.來暫存gap_reloc_pair信息。 所以用完后還要“還回去”

更新終結(jié)隊(duì)列,并提升或降低plug的代

更新段空間

眼見為實(shí)

壓縮

如果GC決定壓縮,就比較復(fù)雜了??傮w分為兩步

復(fù)制對象并移動(dòng)到新位置(重定位階段)將新對象的地址在root上更新GC重定位階段

此步驟更新所有對稍后要移動(dòng)對象的引用,為了更新這些地址,要掃描他們的root,并逐一更新

??臻g的root跨代記憶集的root托管堆中的root前置plug與后置Plug的root終結(jié)器隊(duì)列的root句柄表的root

比如某個(gè)對象的內(nèi)存地址為0x1000,壓縮后它的新地址為0x500。那就就要對該對象的所有root更新內(nèi)存地址。

眼見為實(shí)

    internal class Program
    {
        static void Main(string[] args)
        {
            Append();
            AppendStatic();
            Compact();
        }
        public static Person person;
        public static List<byte[]> list = new List<byte[]>();
        static void Append()
        {
            //填 10M 數(shù)組到 臨時(shí)段上
            for (int i = 0; i < 1024 * 10; i++)
            {
                list.Add(new byte[1000]);
            }
            Console.WriteLine("1. 10M 數(shù)據(jù)已分配完畢,請查看臨時(shí)段大小,準(zhǔn)備分配 Person 對象!");
            Debugger.Break();
        }
        static void AppendStatic()
        {
            person = new Person();
            list = null;
            Console.WriteLine("2. Person 已分配,list已去根,請?jiān)俅斡^察托管堆!準(zhǔn)備觸發(fā) GC,請下 compact_phase 斷點(diǎn)!");
            Debugger.Break();
        }
        static void Compact()
        {
            GC.Collect(2, GCCollectionMode.Forced, true, true);
            Console.WriteLine("3. GC 已觸發(fā),請觀察 Person 是否已變!");
            Debugger.Break();
        }
    }
    public class Person { }

在bp coreclr!WKS::gc_heap::compact_phase 下斷點(diǎn),觀察對象的新老地址變化GC前:

GC后:內(nèi)存地址發(fā)生變化

眼見為實(shí)

壓縮對象

在上面更新root的操作完成后,GC要移動(dòng)所有對象。由以下幾個(gè)步驟組成

復(fù)制對象恢復(fù)“被銷毀”的前置plug和plug重新劃分代邊界釋放內(nèi)存段創(chuàng)建空閑列表眼見為實(shí)

GC前:

GC后:對象被移動(dòng),原有地址被壓縮釋放

眼見為實(shí):復(fù)制連續(xù)的內(nèi)存區(qū)域

以滑動(dòng)的方式來copy內(nèi)存,避免出現(xiàn)覆蓋問題

到此這篇關(guān)于.NET Core GC壓縮(compact_phase)底層原理淺談的文章就介紹到這了,更多相關(guān).NET Core GC壓縮(compact_phase)底層原理淺談內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

盱眙县| 宁津县| 漳州市| 鱼台县| 清涧县| 平定县| 黔西县| 电白县| 扶风县| 天等县| 平南县| 宜都市| 沙湾县| 五指山市| 镇雄县| 靖州| 治县。| 黑山县| 沁源县| 大丰市| 修武县| 额尔古纳市| 阜阳市| 五峰| 越西县| 神农架林区| 云和县| 枝江市| 绥芬河市| 浙江省| 和田县| 拜城县| 广昌县| 汝阳县| 宜宾市| 横峰县| 盖州市| 孟津县| 上林县| 肃南| 彰化市|