簡體   English   中英

.net CLR相關問題

[英].net CLR related question

這是一個與.net CLR相關的問題。

我有3個對象A,B,C

A引用B,B引用c

如果我明確地殺死對象“ A”,堆中的這些對象會發生什么。將對哪些對象進行垃圾回收?(對象A或B或c或全部?)

有人可以詳細解釋這種情況下的垃圾收集過程。

預先感謝SNA

首先-您不能“明確殺死對象“ A””; 您可以清除對其的引用,但這只是將局部變量設置為null ,而與托管堆上的實際對象無關。 您可以使用Dispose() ,但這與GC 無關

一切取決於; 還能看到B / C嗎? 如果沒有,則有資格領取 但是GC是不確定的。 它只會在選擇時發生。 不確定的時間,GC將啟動,檢測到這些對象不可達,然后將其刪除。 在此過程中,它將檢查所有具有終結器(仍未完成)的對象,並執行終結器(分兩步進行)。

人們經常在可及性方面忘記的一件事是事件。 如果B / C訂閱了一個長期對象上的事件,則B / C是可到達的(由事件發布者)。


澄清; GC通過從根對象 (線程等)構建樹來工作。 它遍歷每個引用 ,標記所有可以到達的對象。 末尾未標記的任何內容都可以收集。 這避免了由於數據孤島(X => Y和Y => X)而導致的內存泄漏而導致的COM / COM +問題(X和Y都具有正的引用計數,因此都不會清除)。

第一個誤解可能是您無法明確殺死托管對象。

您可以釋放自己分配的非托管內存,但這些內存不是托管的,因此也不會進行垃圾回收。

當您將對A的引用設置為null或超出范圍時,將不會對B&C進行任何引用,下一個GC集合將予以解決。

在.NET中,沒有辦法真正殺死/刪除對象。 您唯一可以做的就是分配一個對象。 這僅是對對象的Dispose()的簡單調用。 這將使您可以清理對象,然后再由垃圾回收器收集對象(這樣您就不會真正的無用)。 有關更多詳細信息,請參見IDisposable 在GC收集對象之前有機會清理對象的第二種選擇是實現終結器 與Dispose()不同,GC將自動調用它。 同樣,兩者都是在對象可能不存在之前清理所有資源的方法。

因此,要回答您的問題,是否僅當對象A不再被其他對象引用時才會發生“殺死”,而如果B和C僅通過A進行引用,B和C就會被“殺死”。通常,您沒有任何影響力何時實際發生。 您所能做的就是實現終結器,以便在事件發生時得到通知。 GC是一項后台服務,它在單獨的線程上運行,該線程在實際刪除對象時遵循復雜的邏輯。

如果您想對GC的工作原理有一個基本的了解,建議您參考以下兩篇 文章 盡管有些陳舊,但它們仍然完全適用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM