溫馨提示×

溫馨提示×

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

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

.NET垃圾回收器怎么使用

發(fā)布時(shí)間:2022-02-07 15:06:14 來源:億速云 閱讀:106 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了.NET垃圾回收器怎么使用的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇.NET垃圾回收器怎么使用文章都會有所收獲,下面我們一起來看看吧。

.NET 應(yīng)用程序中的垃圾回收器是什么?

垃圾收集器只不過是 CLR 提供的一個(gè)功能,可幫助我們清理或銷毀未使用的托管對象。通過清理或銷毀這些未使用的托管對象,它基本上回收內(nèi)存。

當(dāng)DotNet應(yīng)用程序運(yùn)行時(shí),它會創(chuàng)建多個(gè)對象,并且在給定時(shí)刻,應(yīng)用程序可能不使用其中一些對象。

因此,對于這些對象,垃圾回收器作為后臺線程連續(xù)運(yùn)行,并在特定的時(shí)間間隔時(shí)間,它會檢查是否有任何未使用的托管對象,以及它是否發(fā)現(xiàn)它只是清理這些對象并回收內(nèi)存。

注:垃圾回收器將僅銷毀未使用的托管對象。它不清理非托管對象。

.NET垃圾回收器代數(shù)?

讓我們了解什么是垃圾收集器代,它如何影響垃圾收集器的性能?

在.NET中, 有三代。它們是第0代、第1代和第2代。

了解第0代、第1代和2代

假設(shè)您有一個(gè)名為 App1 的簡單應(yīng)用程序。應(yīng)用程序一啟動,就創(chuàng)建 5 個(gè)托管對象。

每當(dāng)創(chuàng)建任何新對象(新對象)時(shí),它們都會移動到稱為"第 0 代"的存儲桶中。為了更好的理解,請看下圖所示:

.NET垃圾回收器怎么使用

我們知道垃圾收集器作為后臺線程連續(xù)運(yùn)行,以檢查是否有任何未使用的托管對象,以便通過清理這些對象來回收內(nèi)存。

現(xiàn)在,假設(shè)應(yīng)用程序不需要兩個(gè)對象(Object1 和 Object2)。因此,垃圾回收器將銷毀這兩個(gè)對象(Object1 和 Object2),并回收第 0 代存儲桶中的內(nèi)存。

但應(yīng)用程序仍然需要其余三個(gè)對象(Object3、Object4 和 Object5)。

因此,垃圾回收器不會清理這三個(gè)對象。因此,垃圾收集器將做的是,他這三個(gè)托管對象(Object3、Object4 和 Object5)將移動到第 1 代存儲桶,如下圖所示。

.NET垃圾回收器怎么使用

現(xiàn)在,假設(shè)您的應(yīng)用程序又創(chuàng)建了兩個(gè)新對象(Object6 和 Object7)。作為新對象,應(yīng)在第 0 代存儲桶中創(chuàng)建它們,如下圖所示。

.NET垃圾回收器怎么使用

現(xiàn)在,再次運(yùn)行垃圾收集器,它涉及到第 0 代存儲桶和檢查使用的對象。假設(shè)應(yīng)用程序未使用這兩個(gè)對象(Object6 和 Object7),因此它將刪除這兩個(gè)對象并回收內(nèi)存。

現(xiàn)在,它轉(zhuǎn)到第 1 代存儲桶,并檢查哪些對象未使用。假設(shè)應(yīng)用程序仍然需要 Object4 和 Object5,而不需要對象 3。

因此,垃圾收集器將做什么,它將摧毀 Object3 并回收內(nèi)存,以及它將 Objec4 和 Object5 移動到第 3 代存儲桶,如下圖所示。

.NET垃圾回收器怎么使用

什么是幾代?

代不過是什么,它們將定義對象在內(nèi)存中保留的時(shí)間?,F(xiàn)在,你想到的問題是,為什么我們需要幾代?

為什么我們需要幾代?

通常,當(dāng)我們使用大型應(yīng)用程序時(shí),它們可以創(chuàng)建數(shù)千個(gè)對象。因此,每個(gè)對象,如果垃圾回收器去檢查他們真的是否需要,這是一個(gè)非常笨重的過程。

通過創(chuàng)建此類,如果第 2 代存儲桶中的對象意味著"垃圾收集器"將減少對此存儲桶的訪問。

原因是,如果對象移動到第 2 代,則意味著它將在內(nèi)存中停留更多時(shí)間。沒有必要去檢查他們一遍又一遍。

因此,簡單地說,我們可以說第 0 代、第 1 代和 2 代有助于提高垃圾收集器的性能。第 0 代中的對象越好,性能越好,以最佳方式使用內(nèi)存。

如何在類中使用析構(gòu)函數(shù),我們最終進(jìn)入一個(gè)雙垃圾回收器循環(huán)?

垃圾收集器將只清理托管代碼。換句話說,對于任何類型的非托管代碼,要清理這些代碼必須由非托管代碼提供,垃圾回收器無法控制它們來清理內(nèi)存。

例如,假設(shè)您在 VB6 中有一個(gè)名為 MyClass 的類,然后您必須公開一些函數(shù),例如 CLeanUp(), 在該函數(shù)中,您必須編寫邏輯來清理非托管代碼。

從DotNet代碼中,您只需調(diào)用該方法 CLeanUp()即可啟動清理。這點(diǎn),或要從其中調(diào)用清理的部分是類的析構(gòu)函數(shù)。

這看起來是編寫清理代碼的最佳地點(diǎn)。但是,在析構(gòu)函數(shù)中編寫清理時(shí),有一個(gè)與之相關(guān)的大問題。讓我們了解問題出在哪里?

在類中定義析構(gòu)函數(shù)時(shí),垃圾收集器在處置對象之前,將轉(zhuǎn)到類中提出問題,您是否有析構(gòu)函數(shù),如果您有析構(gòu)函數(shù),然后將對象移動到下一代存儲桶。

換句話說,即使未使用析構(gòu)函數(shù)本身,它也會清理具有析構(gòu)函數(shù)的對象。因此,它將等待析構(gòu)函數(shù)運(yùn)行,然后它會去清理對象。因此,與第 0 代相比,第 1 代和第 2 代中的對象更多。

(示例)使用析構(gòu)函數(shù)

創(chuàng)建一個(gè)控制臺應(yīng)用程序,然后在程序類中復(fù)制并粘貼以下代碼。

.NET垃圾回收器怎么使用

注:如果在析構(gòu)函數(shù)中編寫清理代碼,則最終將在第 1 代和第 2 代中創(chuàng)建更多對象,這意味著您沒有正確使用內(nèi)存。

如何克服上述問題?

通過使用所謂的最終處置模式可以解決此問題。

為了實(shí)現(xiàn)這一點(diǎn),類應(yīng)實(shí)現(xiàn) IDisposable 接口,并提供 Dispose 方法的實(shí)現(xiàn)。在 Dispose 方法中,您需要為非托管對象編寫清理代碼,最后需要調(diào)用 GC。通過將 true 作為輸入值傳遞來抑制無限化(true) 方法。

此方法告訴抑制任何類型的析構(gòu)函數(shù),然后去清理對象。為了更好的理解,請看下圖。

.NET垃圾回收器怎么使用

一旦您使用對象,然后您需要調(diào)用 Dispose 方法,以便雙垃圾回收器循環(huán)不會發(fā)生,如下所示。

.NET垃圾回收器怎么使用

完整的代碼如下:

.NET垃圾回收器怎么使用

關(guān)于“.NET垃圾回收器怎么使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“.NET垃圾回收器怎么使用”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

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

AI