2010-05-10 64 views
1

一個< - >乙< - 「ç< - > d < - >一...爪哇 - 循環垃圾收集

// A是firstNode,d是lastNode

 if (length == 1) 
     { 
      firstNode = null; 
      lastNode = null; 

      firstNode.next = null; 
      firstNode.prev = null; 
     } 

     else 
     { 
      Node secondNode = firstNode.next; 
      Node secondToLast = lastNode.prev; 

      firstNode.next = null; 
      firstNode.prev = null; 

      lastNode.next = null; 
      lastNode.prev = null; 

      secondNode.prev = null; 
      secondToLast.next = null; 

      firstNode = null; 
      lastNode = null; 
     } 

應作爲垃圾收集的候選人之間發送所有內容,我希望?

+0

另請參閱http://stackoverflow.com/questions/1910194/garbage-collection-in-java-and-circular-references – polygenelubricants 2010-05-10 04:42:19

+0

可能的重複[Java中的循環引用](http: //stackoverflow.com/questions/176745/circular-references-in-java) – polygenelubricants 2010-05-10 04:42:43

回答

3

只要沒有強引用引用的節點,那麼它不一樣,如果有節點「之間」循環引用關係,對象仍然會是垃圾收集的候選人。

這意味着,當有保存對對象的引用沒有更多的局部變量或靜態變量(它們是否屬於超出範圍,就明確地將其設置爲null或將其分配到別的東西),那麼對象將是垃圾集。

+0

謝謝。 4分鐘後複選標記。 – ShrimpCrackers 2010-05-10 03:49:59

+0

節點之間可以有強引用(例如循環)。要求對象不可訪問(因此可回收)是反陳述:「可到達對象是任何可以在任何可能的連續計算中從任何活動線程訪問的對象。」這是根據JLS 12.6.1。 JLS 12.6.1.1包含更精細的細節。 – 2010-05-10 04:11:42

+0

pst:那幾乎是我說的... – 2010-05-10 04:12:46

2

Java不引用count,所以如果引用是循環的都沒關係。

Java在較高內存密度下使用標記和掃描類型algorthim,在JVM版本1.4,1.5和1.6中使用較低密度的副本清除algorthim。標記和掃描從主程序線程開始標記「可到達」的所有內容,並清除並壓縮未標記的內容。複製並清除將主線程可訪問的所有對象複製到新內存中,然後清除舊內存塊。

由於這兩種技術都是「可以從主線程訪問」的技術,所以如果您製作一堆循環引用,則無關緊要。如果引用是「可從主線程訪問」,那麼整個圓將被標記並保存。如果主線程無法訪問循環引用,那麼它最終會被清除,因爲它沒有被標記爲正在使用中。

Java通過幾代人優化垃圾收集。詳情請看here

默認情況下,Java 1.7可能有一個新的垃圾收集策略。它被稱爲G1,這是垃圾優先的縮寫。他們一直在1.6分支上玩,如果你願意,你可以打開它。它比標準的垃圾收集要快得多,但不清楚它是否沒有缺陷,或者它在所有重要的用例中是否會保持更快。欲瞭解更多信息,請閱讀Garbage First