2014-06-18 104 views
1

有人可以用簡單的話來解釋我的JAVA垃圾回收器如何理解內存的哪個部分是垃圾嗎?垃圾收集器如何檢測垃圾?

我知道垃圾收集器實際上在做什麼,但是如何識別「垃圾」?

+0

您從Google搜索中瞭解到什麼? – AntonH

+0

垃圾是除了你仍然從你的線索引用的東西之外的所有東西。 –

+0

http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx – Brandon

回答

1

在Java虛擬機中,所有數據都是鍵入的,這意味着JVM可以將引用與其他數據區分開來。能夠區分對其他數據的引用是垃圾收集成爲可能的幾乎必要的要求。

垃圾回收器遍歷堆,堆棧和常量池,搜索引用。通常,所有被引用的對象都被標記。然後標記的對象遍歷引用,並且引用的對象又被標記。

如果沒有未跟蹤的引用,則可以確保所有未標記的對象不再可訪問並且可以處置。

這可能是最基本的垃圾收集形式,稱爲標記和清掃垃圾收集器。

請注意,Java標準不要求存在垃圾回收器。實現該標準的JVM永遠不會釋放任何內存。

+0

謝謝,你的確如我所期待的那樣 – user3314027

0

這裏必須有一百個答案,但也許沒有一個很簡單 - 有很多複雜的方法來解釋這:)。我會試一試,以便在此問題被標記爲重複之前,您可以看到它。

  1. 它需要的東西,它知道你「想要」就像一個可見的窗口或一個活動線程 。在更復雜的答案中有這些事情的明確列表。
  2. 它列出了可能訪問這些重要的點的方法。
  3. 它刪除了其他的東西。
2

有許多策略,但通常它會遍歷對象圖(通過從稱爲GC根的特殊對象開始)並標記它可以在圖中找到的那些對象。堆中沒有標記的任何對象本質上都是垃圾,因爲它無法從對象圖中的任何其他對象訪問。

如需更詳細的治療,請查看Oracle's documentation on the JVM's garbage collectorthis article