2010-10-18 57 views
4

當您將一個從MarshalByRefObject繼承的對象傳遞給另一個AppDomain時,創建該AppDomain的AppDomain不會誘發GC.Collect()收集對象,前提是該對象未根要麼通過GC.Collect()調用AppDomain?通過AppDomain邊界的垃圾收集對象

[當我說不是源於我的意思是沒有任何開發人員編寫的代碼訪問它了。]

看來,對象沒有被收集而獲得晉升的下一代!

但是,如果我停止傳遞對象到一個差異AppDomain,它正在收集按預期。

這是行爲設計​​嗎?如果是這樣的理由?

謝謝你們,

P.S.我知道代碼中的GC.Collect()很糟糕,原因很多,我只是想了解GC如何在MBRO上進行。

回答

2

正如您所提到的,MBRO物體很難追蹤gc。所以MS實施他們的行爲有點不同。
這些對象有兩個屬性:它們的初始生命週期(我認爲是五分鐘)和RenewOnCallTime(兩分鐘)。如果創建了MBRO對象,它具有初始生命週期。一旦這個時間爲零,它被標記爲gc。
對象上的每次調用都允許對象更長時間地活着RenewOnCallTime(如果剩餘的生命週期小於RenewOnCallTime)。

例如(5分鐘初始生命期,2分鐘RenewOnCallTime):
對象創建:生命期是五分鐘;
4分鐘通過;生命是一分鐘;
打電話給對象;終身是兩分鐘;
2分鐘通過;
對象標記爲gc,否終生離開;

MSDN的某處有一篇關於此的好文章(我現在找不到:/)

+0

Fge,謝謝!好吧,雖然我們放棄了對MBRO運行時的引用,但仍然通過租賃和生命週期管理服務繼續保留對象。我會閱讀更多關於這些領域。 – RanC 2010-10-19 05:54:14

+0

此鏈接可能嗎? http://msdn.microsoft.com/en-us/library/23bk23zc(v=vs.85).aspx – Spook 2014-03-27 11:18:23