国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

.net垃圾回收-原理淺析

2019-11-17 02:30:19
字體:
來源:轉載
供稿:網友
.net垃圾回收-原理淺析

本文引自:http://m.survivalescaperooms.com/wilber2013/p/4357910.html

在開發.NET程序過程中,由于CLR中的垃圾回收(garbage collection)機制會管理已分配的對象,所以程序員就可以不用關注對象什么時候釋放內存空間了。但是,了解垃圾回收機制還是很有必要的,下面我們就看看.NET垃圾回收機制的相關內容。

創建對象

在C#中,我們可以通過new關鍵字創建一個引用類型的對象,比如下面一條語句。New關鍵字創建了一個Student類型的對象,這個新建的對象會被存放在托管堆中,而這個對象的引用會存放在調用棧中。(對于引用類型可以查看,C#中值類型和引用類型)

Student s1 = new Student();

在C#中,當上面的Student對象被創建后,程序員就可以不用關心這個對象什么時候被銷毀了,垃圾回收器將會在該對象不再需要時將其銷毀。

當一個進程初始化后,CLR就保留一塊連續的內存空間,這段連續的內存空間就是我們說的托管堆。.NET垃圾回收器會管理并清理托管堆,它會在必要的時候壓縮空的內存塊來實現優化,為了輔助垃圾回收器的這一行為,托管堆保存著一個指針,這個指針準確地只是下一個對象將被分配的位置,被稱為下一個對象的指針(NextObjPtr)。為了下面介紹垃圾回收機制,我們先詳細看看new關鍵字都做了什么。

new關鍵字

當C#編譯器遇到new關鍵字時,它會在方法的實現中加入一條CIL newobj命令,下面是通過ILSpy看到的IL代碼。

IL_0001: newobj instance void GCTest.Student::.ctor()

其實,newobj指令就是告訴CLR去執行下列操作:

  • 計算新建對象所需要的內存總數
  • 檢查托管堆,確保有足夠的空間來存放新建的對象
    • 如果空間足夠,調用類型的構造函數,將對象存放在NextObjPtr指向的內存地址
    • 如果空間不夠,就會執行一次垃圾回收來清理托管堆(如果空間依然不夠,就會報出OutofMemoryException)
  • 最后,移動NextObjPtr指向托管堆下一個可用地址,然后將對象引用返回給調用者

按照上面的分析,當我們創建兩個Student對象的時候,托管堆就應該跟下圖一致,NextObjPtr指向托管堆新的可用地址。

托管堆的大小不是無限制的,如果我們一直使用new關鍵字來創建新的對象,托管堆就可能被耗盡,這時托管堆可以檢測到NextObjPtr指向的空間超過了托管堆的地址空間,就需要做一次垃圾回收了,垃圾回收器會從托管堆中刪除不可訪問的對象

應用程序的根

垃圾回收器是如何確定一個對象不再需要,可以被安全的銷毀?

這里就要看一個應用程序根(application root)的概念。根(root)就是一個存儲位置其中保存著對托管堆上一個對象的引用,根可以屬性下面任何一個類別:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 奉化市| 讷河市| 东山县| 昌乐县| 疏勒县| 荃湾区| 嫩江县| 额敏县| 墨江| 普兰店市| 鄂托克前旗| 子洲县| 苏尼特右旗| 循化| 尉氏县| 绥阳县| 泸定县| 重庆市| 蒙自县| 贵阳市| 抚州市| 白城市| 黄骅市| 家居| 陆良县| 彩票| 乳山市| 山丹县| 阜宁县| 望谟县| 蓝田县| 曲周县| 江西省| 贡嘎县| 固始县| 丰镇市| 沙田区| 紫云| 都江堰市| 渝北区| 河东区|