欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

簡介

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

清除

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

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

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

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

更新段空間

眼見為實

壓縮

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

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

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

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

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

眼見為實

    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ù)組到 臨時段上
            for (int i = 0; i < 1024 * 10; i++)
            {
                list.Add(new byte[1000]);
            }
            Console.WriteLine("1. 10M 數(shù)據(jù)已分配完畢,請查看臨時段大小,準備分配 Person 對象!");
            Debugger.Break();
        }
        static void AppendStatic()
        {
            person = new Person();
            list = null;
            Console.WriteLine("2. Person 已分配,list已去根,請再次觀察托管堆!準備觸發(fā) GC,請下 compact_phase 斷點!");
            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 下斷點,觀察對象的新老地址變化GC前:

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

眼見為實

壓縮對象

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

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

GC前:

GC后:對象被移動,原有地址被壓縮釋放

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

以滑動的方式來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)文章

最新評論