2014-01-08 56 views
8

我知道一個保留週期(至少在Objective-C和Swift中)是兩個對象聲明對方的所有權(它們彼此之間是相互引用的)。在Objective-C中,我們可以通過聲明其中一個weak來解決問題。Java保留週期(垃圾回收)

從我已閱讀並理解,Java的GC不受保留週期,我們不必擔心weak引用。它如何解決它?

+0

它不使用引用計數。它不是尋找垃圾,而是尋找主動/強烈可達的對象,並回收剩餘的對象。 –

回答

15

Java垃圾收集器的工作原理是尋找「可達」的對象 - 從根(一個或多個)。如果他們無法到達(如果他們沒有外部對象引用),那麼可以丟棄整個對象圖。

本質上,它只是只是橫穿從根(S)到葉節點和標記它遇到的所有對象的樹。任何未被堆中標記對象佔用的內存都會被清除(標記爲空閒)。這被稱爲mark and sweep。 IMG SRC

Mark and sweep in action

這不能輕易這樣做,因爲它使用reference counting,沒有標記和清除這has it's flaws

的原因不能有任何保留週期是因爲如果他們不鏈接到任何地方的「樹」,它們不被標記並且可以被丟棄。

+1

鏈接網站ht​​tp://www.brpreiss.com/books/opus5/html/page421.html似乎被黑客...不要點擊,也許你可以找到一個在線檔案修復鏈接? –

+0

謝謝,更新到工作鏈接 –

0

顧名思義,垃圾收集是指去除不再使用的對象 。衆所周知的事實是,它們的作用域對象無論如何都是 ,Java將對象存儲在堆中。因此,如果我們保留 創建對象而不清除堆,我們的計算機可能會在堆空間運行 ,並且出現「內存不足」錯誤。垃圾收集 在Java中是被控制並執行由Java 虛擬機(JVM)以釋放 對象它們不再使用佔用的堆空間的機制。與C++相比,java中的垃圾收集器 重新開發了來自內存管理 相關活動的開發人員。 JVM通過稱爲'垃圾收集器'的 惡魔線程的幫助來執行此過程。垃圾收集器 線程首先調用該對象的finalize方法。這對所述對象執行清理活動 。作爲開發人員,我們不能強制JVM運行垃圾回收器線程。雖然有 方法(例如Runtime.gc()或System.gc()),但這些方法都不會確保 執行垃圾回收器線程。這些方法用於 向JVM發送垃圾收集請求。當它啓動垃圾收集過程時,它由Java虛擬機決定。

這個東西

How Garbage Collection works in Java

0

在基本方面來看看,垃圾收集的工作方式是從多種預定義根走的對象圖。任何從這些根不可訪問的東西都是垃圾,因此一個引用另一個的對象是不相關的,除非可以從一個或多個根訪問。

這一切都在更詳細的解釋How Garbage Collection Really Works

4

垃圾回收器從根(通常是:調用堆棧或全局變量上的變量)開始查找可到達的對象。因此,如果兩個對象相互引用,但不能以其他方式訪問,則它們不會被標記爲「活動」並且將被收集。