.NET?Core?GC壓縮(compact_phase)底層原理解析
簡介
終于來到了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)文章
.NET中用ICSharpCode.TextEditor自定義代碼折疊與高亮
這篇文章主要給大家介紹了.NET中用ICSharpCode.TextEditor自定義代碼折疊與高亮的相關(guān)資料,文中通過示例代碼與圖片介紹的很詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-02-02asp.net(c#)開發(fā)中的文件上傳組件uploadify的使用方法(帶進度條)
在asp.net開發(fā)中,有很多可以上傳的組件模塊,利用HTML的File控件(uploadify)的上傳也是一種辦法,這里為大家介紹一下(uploadify)的一些使用方法2012-12-12asp.net MVC使用PagedList.MVC實現(xiàn)分頁效果
這篇文章主要為大家詳細介紹了asp.net MVC使用PagedList.MVC實現(xiàn)分頁效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07ASP.NET State service狀態(tài)服務(wù)的問題解決方法
每次重啟機器以后,在.NET2005上跑Web程序老是遇到這樣的問題2008-11-11