2014-02-07 56 views
1

這裏是爲C#程序的設置:雙物體內存泄漏?

內部主要類:ObjA MyObjA = new ObjA();

內ObjA:ObjB MyObjB = new ObjB();

所以主要有ObjA參考,並ObjA有ObjB參考。

現在,讓我們來說,在主類中,我設置了MyObjA = null;垃圾回收器是否會出現並摧毀ObjA?或者它會保存它,因爲它引用了ObjB(它還沒有被銷燬)?

你可以看到在後一種情況下這將是一個巨大的內存泄漏。但是作爲一個方面說明,如果前一種情況屬實,那麼在ObjB被銷燬之前是否需要1次或2次GC通過?

另外,有人可以告訴我在Android Java中會發生什麼嗎?這是我與atm合作的兩種語言。

+0

你不能設置'ObjA = null'。您只能將指向ObjA的指針設置爲null,而不是:'MyObjA = null'。 –

+0

Android和/或Java甚至沒有循環引用的問題,因爲垃圾收集不是基於簡單的引用計數(例如,計算有多少對象有一個引用給我,一旦計數爲0的空閒內存)就像它是(是?)在[ObjectiveC]中(http://pivotallabs.com/why-not-to-use-arc/)。 – zapl

+0

@KeithPayne thanx,是一個打字錯誤/ mentalo,我編輯它,我的意思 – DrZ214

回答

1

MyObjA和MyObjB都將被銷燬,因爲它們無法從任何GC根目錄(像靜態變量,堆棧變量或遞歸式指向這樣的東西)無法訪問。

我不完全確定你的意思是兩次通過。 Java垃圾回收器的細節有點複雜,但如果對象無法訪問,則應該在單個GC循環中清理它們。

+0

2遍,就像第一個ObjA被破壞一樣,然後在下一個傳球中它意識到什麼都沒有指向ObjB,所以它會在第二次被破壞......另外,我是如何獲得編輯權限的! – DrZ214

+0

@ user1705043:在一個簡單的標記和掃描中,將發生的事情是GC將從GC根中遍歷,標記出它看起來可以訪問的所有東西。然後它會注意到MyObjA和MyObjB未到達並清理它們。所以垃圾收集器的一次運行。 – mrmcgreg

+0

@ user1705043:我想你只是提出了編輯建議。看起來你需要2000分來平整編輯:http://stackoverflow.com/help/privileges/edit。 – mrmcgreg