如果一個對象有5個引用,那麼該對象能夠找出引用他的內容? 因爲我知道Java(希望C#
)有一個GC列表。誰知道我? (對象編年史)
2
A
回答
8
不,沒有「參考文獻列表」。 GC不需要知道引用對象的所有內容 - 它只需知道是否引用任何對象。
作爲GC的一個非常粗糙的模型,它將堆中的每個對象都標記爲垃圾,然後查看它認爲是非垃圾(「根」對象)的對象。例如,它會查看每個線程的堆棧以及線程中的每個實例方法,它通常會將目標實例標記爲非垃圾文件。
然後它會經過每個根,看看哪些對象那些那些指的是...並將它們標記爲非垃圾。它會緩解下來,找到它所能做的一切。然後可以收集(或確定)任何未被標記爲非垃圾的東西。
從這個算法中可以看出,GC不需要爲每個對象保留一個完整的引用列表 - 只是說一些「垃圾」或「非垃圾」。
很顯然,在Java和.NET中,GC比這個複雜得多,世代垃圾回收器和各種策略可以最大限度地減少GC「暫停」併爲GC使用多線程。希望這個簡化的視圖足以解釋爲什麼甚至GC也沒有引用列表。
並不總是,在.NET的情況下。一個對象可以被垃圾回收,而實例方法仍然在「運行」它,如果該方法沒有引用從當前點向前的對象中的任何字段。
0
如果您無法爲此找到語言支持,只需讓每個想要持有對所討論對象的引用的對象都調用一個方法,告訴正在引用的對象。然後該對象將引用對象添加到列表中。每當您放棄對該對象的引用時,就會調用另一種方法從列表中刪除引用者。
相關問題
- 1. 誰知道unix fork的歷史?
- 2. 有誰知道ASP.NET Webforms的歷史?
- 3. 知道是誰鎖定的對象
- 4. 誰應該知道對方?
- 5. C++我想知道對象
- 6. 編年史問題?難道我做錯了什麼?
- 7. 我如何知道誰訪問了phpmyadmin
- 8. oozie如何知道我是誰?
- 9. 有誰知道Google Analytics數據點對象的屬性嗎?
- 10. 如何知道誰在處理我的Bitmap對象或它已被處置?
- 11. 如何知道誰是FirstResponder?
- 12. 誰知道Sedgewick-Vitter算法?
- 13. 使用計時器知道對象的年齡
- 14. 如何知道誰擁有ReaderWriterLockSlim?
- 15. 有誰知道TIdHTTP的緩存組件?
- 16. 我如何知道哪些對象保留了一個對象?
- 17. 知道一個對象C#
- 18. 從XML中知道對象
- 19. 有誰知道瀏覽器模擬器?
- 20. 有誰知道使用PHP和捲曲
- 21. 誰知道我如何獲得消息框的代碼?
- 22. 編年史圖原子性語義
- 23. 有誰知道任何精靈集合?
- 24. 我如何知道誰簽出了這份工作副本?
- 25. 有誰知道sed -i的實現?
- 26. 有誰知道演示JSON服務器?
- 27. 我如何知道誰使用我的API?
- 28. sql-server:我如何知道誰在我的數據庫中?
- 29. 有誰知道LESS CSS「主題表」?
- 30. 有誰知道'LINQ to XLSX'提供者?
很快就會變成病毒......因爲現在一個對象需要知道什麼時候它將被垃圾收集,以便它可以自行移除。你要麼終結一切都有終結者,要麼到處都有大量的代碼來執行家務管理。 – 2010-06-26 07:14:16
多數民衆贊成在即時嘗試避免! 這是要變得沉重! 與他們之間的一些鏈接im計劃與10000對象和期望的模型。 如果生病只是在他們的名單上,它可以是一個100000的開銷到一個密爾參考 – kalix 2010-06-26 07:18:45
@kalix:那麼你應該重新設計,以便你不需要知道「父母」。 – 2010-06-26 07:26:44