記錄什麼是托管代碼?學習過程。 托管代碼 C#,就是其中一種托管代碼。托管代碼的執行過程可以交由運行時管理,在.Net里,這種運行時稱為“公共語言運行時”(Common Language RunTime,CLR)。 托管代碼先經過編譯器編譯成“中間語言”代碼(Intermediate Languag ...
記錄什麼是托管代碼?學習過程。
托管代碼
C#,就是其中一種托管代碼。托管代碼的執行過程可以交由運行時管理,在.Net里,這種運行時稱為“公共語言運行時”(Common Language RunTime,CLR)。
托管代碼先經過編譯器編譯成“中間語言”代碼(Intermediate Language,IL),然後CLR啟動“實時”(just-in-time,JIT),將IL編譯成機器代碼,並同時提供自動記憶體管理、安全邊界、類型安全等服務。
CLR允許托管代碼越界,C# 語言可讓你利用所謂的不安全上下文(指定執行過程不由 CLR 管理的代碼片段),在代碼中直接使用非托管構造,例如指針。
自動記憶體管理
CLR有一個垃圾回收器,自動分配和釋放記憶體。
CLR為應用程式進程建立一個“連續的地址空間”即“托管堆”,應用程式每創建一個引用類型對象時,垃圾回收器就會按順序的在托管堆上取地址空間,如果該地址空間可用,則在該地址空間內為新建的對象分配記憶體,否則跳到下一個地址空間。
垃圾回收器通過訪問運行時維護“對象活動根”列表,得知哪些對象沒有跟即沒有訪問的入口,然後釋放這些對象的占用的記憶體。
在回收大量無法訪問的對象時,會採取壓縮記憶體的方法。但是,為了避免移動記憶體中的大型對象,不會壓縮此記憶體。
待閱讀 https://docs.microsoft.com/zh-cn/dotnet/standard/automatic-memory-management