2012-12-08 55 views
3

或者我可能會問與更新的GC是否有關係?什麼是最好的循環圖表示,以善待Java GC

如果是的話那麼是需要通過查找表或使用弱引用(但更多的內存)管理節點之間的鏈接,或者是罰款只是把所有的節點指向對方。這是假設我有一個「dispose」方法,其中節點或鏈接刪除將它的所有引用設置爲null。

的問題是,如果在RAM中的大型數據庫,那會是一個劇烈擊中GC性能,如果它在圖形進行計算長了很多隨機的週期?或不?

回答

7

標記和掃描垃圾收集方法對對象圖的拓撲完全不敏感。只要它到達一個已經標記的對象,它就會假定它所有的對象都被標記了,所以不管你如何設計你的結構,你都不會造成太大的傷害。

我的建議是要強迫大約保持你的代碼作爲一個自然貼合的問題越好,任何其他問題相當寬鬆。當你遇到真正的性能/內存問題時,只有當你停下來思考優化時纔會出現。

+0

我很高興知道,在確定內存值是句柄還是數據時,會有一些開銷,並且可能涉及必須以某種方式遍歷拓撲。 – peterk

0

這將會是相當令人失望,如果Java的GC是由循環引用打破。幸運的是,事實並非如此。雖然我不明白你的問題的數據庫部分。我認爲如果你對你實際做的事情有更多的瞭解,這會有很大的幫助。

+0

我知道:) 的guestion是,是否大循環圖以典型的Java VM垃圾收集器以任何方式影響GC性能。諸如在樹中的孩子中保留父指針等等。我經常看到評論和帖子,大意是這樣的事情會影響性能,這是一個壞主意。 – peterk

0

HotSpot虛擬機的垃圾收集器不使用引用計數。有標記/掃描/壓縮收藏家或複製收藏家,它們都從它的根(全部調用堆棧上的本地變量)遍歷對象圖(這裏指的是JVM中的所有Java對象的圖)活動線程,靜態字段等)。

基本上,只要對象是不是從任何根可達,那麼它只是,不管其他的死亡對象有多少引用它。在這種情況下的死亡實際上並不意味着對象的內存已經被釋放,它只是說在下次運行期間對象將被GC回收(刪除)。

簡單地說,所有的圖遍歷期間,GC訪問是活着,其他所有的對象都是

所以每當你空你的圖形結構的所有外部引用,那麼整個圖形結構將被垃圾收集,不管有多少內部引用保持。

這裏是標記&的一個很好的解釋掃算法由鮑勃·李:在同一個視頻

http://www.youtube.com/watch?v=KTC0g14ImPc#t=177s 後來: http://www.youtube.com/watch?v=KTC0g14ImPc#t=2917s

+0

「只要[...]」[...]「使得它聽起來像GC將立即發生,否則圖形結構只會變得有資格被GCed。我會更清楚地重述它。 –

+0

是的,我想我並沒有很清楚地解釋在這種情況下「死亡」究竟意味着什麼。 – Natix