溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.NET Framework 的垃圾回收器管理應用程序的內(nèi)存分配和釋放

發(fā)布時間:2020-04-10 05:29:05 來源:網(wǎng)絡 閱讀:993 作者:賀俊峰 欄目:編程語言
C#中使用 new 運算符創(chuàng)建對象時,運行庫都從托管堆為該對象分配內(nèi)存。只要托管堆中有地址空間可用,運行庫就會繼續(xù)為新對象分配空間。
但是,內(nèi)存不是無限大的。最終,垃圾回收器必須執(zhí)行回收以釋放一些內(nèi)存。垃圾回收器優(yōu)化引擎根據(jù)正在進行的分配情況確定執(zhí)行回收的最佳時間。當垃圾回收器執(zhí)行回收時,它檢查托管堆中不再被應用程序使用的對象并執(zhí)行必要的操作來回收它們占用的內(nèi)存。
 
實例化新對象過程: 如圖
.NET Framework 的垃圾回收器管理應用程序的內(nèi)存分配和釋放 
         首先、計算字段所需空間和對象所需空間。
                   對象所需空間包括兩部分,同步塊索引和類型對象指針。
         再次、分配物理內(nèi)存,新對象指針指象下一個可用內(nèi)存區(qū)域。
 
 
垃圾回收過程 如下圖
.NET Framework 的垃圾回收器管理應用程序的內(nèi)存分配和釋放
 
       標記階段:從根標記遍歷到的對象。
       壓縮階段:釋放沒有標記的對象內(nèi)存,調(diào)整存在對象的位置
 
代(Generation)是CLR垃圾收集器的一種機制,它存在的惟一目的就是提高應用程序性能。
CLR初始化時,托管堆中沒有任何對象,此時添加對象是,為第0代對象。
 
CLR支持3代內(nèi)存
0代對象預算容量為256k
1代對象預算容量為2M
2代對象預算容量為10M
 .NET Framework 的垃圾回收器管理應用程序的內(nèi)存分配和釋放
 
         第一次初始化是為第0代,當托管堆中第0代放滿時,如果有新對象加入,則觸發(fā)CLR
回收垃圾器把第0代中沒有使用的對象清理掉,再把第0代的對象挪到第1代中,之后再把新對象添加托管堆的第0代中。
 
.NET Framework 的垃圾回收器管理應用程序的內(nèi)存分配和釋放

         如果第0代放滿而第1代沒放滿,CLR回收器只把第0代中不在使用的對象清理掉,而第1代中的不變,之后再把第0代挪入第1代,把新對象添加到第0
 
         當?shù)?/span>1代和第1代也放滿時,如果再有新對象加入,則觸發(fā)CLR回收垃圾器把第0代和第1代中沒有使用的對象清理掉,再把第0代的對象挪到第1代中,第1代的對象挪到第2代中,之后再把新對象添加托管堆的第0代中。
依次類推
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI