熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JAVA垃圾回收算法摘要

2013-11-23 19:17:17  來源: Java核心技術 

  垃圾收集的算法分析

  java語言規范沒有明確地說明jvm使用哪種垃圾回收算法但是任何一種垃圾收集算法一般要做件基本的事情)發現無用信息對象)回收被無用對象占用的內存空間使該空間可被程序再次使用

  大多數垃圾回收算法使用了根集(rootset)這個概念(有了這個概念應該就能解決面試中被問到的互為引用的孤獨島的情況)所謂根集就是正在執行的java程序可以訪問的引用變量的集合(包括局部變量參數類變量)程序可以使用引用變量訪問對象的屬性和調用對象的方法垃圾收集首選需要確定從根開始哪些是可達的和哪些是不可達的從根集可達的對象都是活動對象它們不能作為垃圾被回收這也包括從根集間接可達的對象而根集通過任意路徑不可達的對象符合垃圾收集的條件應該被回收下面介紹幾個常用的算法

  引用計數法(referencecountingcollector)

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

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

  tracing算法(tracingcollector)

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

  compacting算法(compactingcollector)

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

  coping算法(copingcollector)

  該算法的提出是為了克服句柄的開銷和解決堆碎片的垃圾回收它開始時把堆分成一個對象面和多個空閒面程序從對象面為對象分配空間當對象滿了基於coping算法的垃圾收集就從根集中掃描活動對象並將每個活動對象復制到空閒面(使得活動對象所占的內存之間沒有空閒洞)這樣空閒面變成了對象面原來的對象面變成了空閒面程序會在新的對象面中分配內存

  一種典型的基於coping算法的垃圾回收是stopandcopy算法它將堆分成對象面和空閒區域面在對象面與空閒區域面的切換過程中程序暫停執行

  generation算法(generationalcollector)

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

  adaptive算法(adaptivecollector)

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


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26582.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.