java語言

當前位置 /首頁/計算機/java語言/列表

java垃圾回收演算法講解

Java的堆是一個執行時資料區,類的例項(物件)從中分配空間。Java虛擬機器(JVM)的堆中儲存著正在執行的應用程式所建立的所有物件,這些物件通過new、newarray、anewarray和multianewarray等指令建立,但是它們不需要程式程式碼來顯式地釋放。以下是小編為大家搜尋整理的java垃圾回收演算法講解,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!

java垃圾回收演算法講解

  1、引用計數法(referencecountingcollector)

引用計數法是唯一沒有使用根集的垃圾回收得法,該演算法使用引用計數器來區分存活物件和不再使用的物件。一般來說,堆中的每個物件對應一個引用計數器。當每一次建立一個物件並賦給一個變數時,引用計數器置為1。當物件被賦給任意變數時,引用計數器每次加1。當物件出了作用域後(該物件丟棄不再使用),引用計數器減1,一旦引用計數器為0,物件就滿足了垃圾收集的條件。

基於引用計數器的垃圾收集器執行較快,不會長時間中斷程式執行,適宜地必須實時執行的程式。但引用計數器增加了程式執行的開銷,因為每次物件賦給新的變數,計數器加1,而每次現有物件出了作用域生,計數器減1。

  2、tracing演算法(tracingcollector)

tracing演算法是為了解決引用計數法的問題而提出,它使用了根集的概念。基於tracing演算法的垃圾收集器從根集開始掃描,識別出哪些物件可達,哪些物件不可達,並用某種方式標記可達物件,例如對每個可達物件設定一個或多個位。在掃描識別過程中,基於tracing演算法的垃圾收集也稱為標記和清除(mark-and-sweep)垃圾收集器.

  3、compacting演算法(compactingcollector)

為了解決堆碎片問題,基於tracing的垃圾回收吸收了compacting演算法的思想,在清除的過程中,演算法將所有的物件移到堆的一端,堆的另一端就變成了一個相鄰的空閒記憶體區,收集器會對它移動的所有物件的所有引用進行更新,使得這些引用在新的位置能識別原來的物件。在基於 compacting演算法的收集器的實現中,一般增加控制代碼和控制代碼表。

  4、coping演算法(copingcollector)

該演算法的提出是為了克服控制代碼的開銷和解決堆碎片的垃圾回收。它開始時把堆分成一個物件面和多個空閒面,程式從物件面為物件分配空間,當物件滿了,基於coping演算法的垃圾收集就從根集中掃描活動物件,並將每個活動物件複製到空閒面(使得活動物件所佔的記憶體之間沒有空閒洞),這樣空閒面變成了物件面,原來的物件面變成了空閒面,程式會在新的物件面中分配記憶體。

一種典型的基於coping演算法的垃圾回收是stop-and-copy演算法,它將堆分成物件面和空閒區域面,在物件面與空閒區域面的切換過程中,程式暫停執行。

  5、generation演算法(generationalcollector)

stop-and-copy垃圾收集器的一個缺陷是收集器必須複製所有的活動物件,這增加了程式等待時間,這是coping演算法低效的原因。在程式設計中有這樣的規律:多數物件存在的`時間比較短,少數的存在時間比較長。因此,generation演算法將堆分成兩個或多個,每個子堆作為物件的一代 (generation)。由於多數物件存在的時間比較短,隨著程式丟棄不使用的物件,垃圾收集器將從最年輕的子堆中收集這些物件。在分代式的垃圾收集器執行後,上次執行存活下來的物件移到下一最高代的子堆中,由於老一代的子堆不會經常被回收,因而節省了時間。

  6、adaptive演算法(adaptivecollector)

在特定的情況下,一些垃圾收集演算法會優於其它演算法。基於adaptive演算法的垃圾收集器就是監控當前堆的使用情況,並將選擇適當演算法的垃圾收集器。