自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.Net Framework垃圾收集具體算法詳解

開(kāi)發(fā) 后端 算法
.Net Framework垃圾收集主要是在對(duì)象在、充滿(mǎn)時(shí)才會(huì)出現(xiàn)。我們可以便利所有的根,然后構(gòu)造出一個(gè)包含所有可達(dá)對(duì)象的圖。

.Net Framework是由微軟提供的一款基于.NET開(kāi)發(fā)的基礎(chǔ)環(huán)境。不過(guò)在這個(gè)編程平臺(tái)下,我們還可以使用其他各種語(yǔ)言來(lái)進(jìn)行代碼的編寫(xiě),大大提高了程序員的開(kāi)發(fā)效率。在這里就先來(lái)了解一下.Net Framework垃圾收集的相關(guān)算法。#t#

1..Net Framework垃圾收集只有在第0代對(duì)象充滿(mǎn)時(shí)才會(huì)出現(xiàn)。

2.每組應(yīng)用程序都有一組根,一個(gè)根是一個(gè)存儲(chǔ)位置,其中包含著一個(gè)指向引用類(lèi)型的內(nèi)存指針。同時(shí),當(dāng)JIT編譯器編譯一個(gè)方法的IL代碼時(shí),除產(chǎn)生本地CPU代碼外,JIT編譯器還會(huì)創(chuàng)建一個(gè)內(nèi)部表,該表的每個(gè)條目包含一個(gè)方法的本地CPU指令的字節(jié)偏移范圍,及該范圍中的一組包含跟的內(nèi)存地址。

3.當(dāng)垃圾收集器開(kāi)始執(zhí)行時(shí),它先假設(shè)應(yīng)用程序中沒(méi)有一個(gè)根引用著托管堆中的對(duì)象。然后,遍歷所有的根,構(gòu)造出一個(gè)包含所有可達(dá)對(duì)象的圖。任何不在該圖中的對(duì)象都將是應(yīng)用程序不可訪(fǎng)問(wèn)的對(duì)象 ,也是可以被執(zhí)行垃圾收集的對(duì)象。

為什么.Net Framework垃圾收集的功能如此強(qiáng)大,而ANSI C++沒(méi)有采用它?

這是因?yàn)槔占鞅仨毮軌蜃R(shí)別出應(yīng)用程序的根,并且還要找到所有的對(duì)象指針。非托管C++允許我們進(jìn)行類(lèi)型轉(zhuǎn)換,而無(wú)從知道它真正引用的對(duì)象是什么。在CLR中,托管堆總能知道一個(gè)對(duì)象的實(shí)際類(lèi)型,從而使其元數(shù)據(jù)信息來(lái)判斷一個(gè)對(duì)象的哪些成員引用著其他的對(duì)象。

任何封裝了非托管資源的類(lèi)型,例如文件、網(wǎng)絡(luò)鏈接、套接字、互斥體等,都必須支持一種稱(chēng)作終止化(Finalization)的操作。終止化操作允許一種資源在它所占用的內(nèi)存被回收之前首先執(zhí)行一些清理工作。

如果一個(gè)封裝了非托管資源的類(lèi)型沒(méi)有定義Finalize方法,那么這些托管資源將得不到關(guān)閉,從而導(dǎo)致某種程度的資源泄露,直到進(jìn)程結(jié)束,這些非托管資源才會(huì)被操作系統(tǒng)回收。

Finalize方法的問(wèn)題在于我們不能確定它會(huì)在何時(shí)被調(diào)用,而且它不是公有方法,因此不能顯式調(diào)用它。

我們可以通過(guò)顯示調(diào)用Dispose方法來(lái)釋放對(duì)象所封裝的非托管資源。

調(diào)用Dispose或Close方法只是在一個(gè)確定的時(shí)刻對(duì)對(duì)象占用的非托管資源執(zhí)行清理操作而已,但不會(huì)控制托管堆中對(duì)象所使用的內(nèi)存的生存期。這意味著我們?cè)谡{(diào)用過(guò)Dispose或Close方法之后,對(duì)象的內(nèi)存仍然存在,只是對(duì)象被執(zhí)行資源清理后,不能再成功執(zhí)行某些方法而已。

C#的using語(yǔ)句:編譯時(shí),編譯器會(huì)自動(dòng)產(chǎn)生一個(gè)try塊和一個(gè)finally塊,在finally塊中,編譯器會(huì)產(chǎn)生代碼將變量轉(zhuǎn)型為一個(gè)Idisposable接口,并調(diào)用其上的Dispose方法。

但我們應(yīng)謹(jǐn)慎使用C#的using語(yǔ)句,避免過(guò)早的執(zhí)行了資源清理

垃圾收集器中代齡的工作機(jī)制:CLR的托管堆支持3個(gè)代齡,但初始化時(shí),它會(huì)為這三代選擇3個(gè)閾值容量,選擇閾值容量是為了提高系統(tǒng)性能,閾值容量越大,垃圾收集執(zhí)行的頻率也就越低。

另外,CLR垃圾收集器還有一個(gè)自調(diào)節(jié)的能力,會(huì)學(xué)習(xí)應(yīng)用程序的行為,調(diào)節(jié)閾值容量,從而改變.Net Framework垃圾收集執(zhí)行的頻率,提高系統(tǒng)性能。

責(zé)任編輯:曹凱 來(lái)源: 博客園
相關(guān)推薦

2010-03-04 10:08:54

.Net垃圾收集

2009-06-15 16:14:40

Java垃圾收集算法GC

2010-03-04 14:33:11

.NET垃圾收集

2010-01-06 18:27:06

.Net Framew

2024-07-15 08:00:00

2010-01-06 16:45:42

.Net Framew

2009-08-26 14:52:19

.NET Framew

2009-07-09 09:28:19

.Net Micro

2012-01-09 16:00:56

2010-01-05 16:20:46

.NET Framew

2010-01-05 09:35:07

.Net Framew

2010-01-05 18:09:07

.NET Framew

2009-10-30 10:47:48

VB.NET垃圾收集器

2010-01-06 19:38:16

.NET Framew

2010-01-05 18:14:17

.NET Framew

2010-01-05 16:15:05

.NET Framew

2010-01-05 10:29:43

.NET Framew

2017-09-21 14:40:06

jvm算法收集器

2024-03-15 08:04:30

G1CMSJVM

2023-02-26 11:50:04

Hbase程序Oracle
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)