济宁蓖乒工艺品有限责任公司

當(dāng)前位置:

java認(rèn)證考試基礎(chǔ)串講資料JAVA垃圾收集的算法

發(fā)表時(shí)間:2015/4/8 11:20:36 來(lái)源:互聯(lián)網(wǎng) 點(diǎn)擊關(guān)注微信:關(guān)注中大網(wǎng)校微信
關(guān)注公眾號(hào)

垃圾收集的算法分析

java語(yǔ)言規(guī)范沒(méi)有明確地說(shuō)明jvm使用哪種垃圾回收算法,但是任何一種垃圾收集算法一般要做2件基本的事情:(1)發(fā)現(xiàn)無(wú)用信息對(duì)象;(2)回收被無(wú)用對(duì)象占用的內(nèi)存空間,使該空間可被程序再次使用。

大多數(shù)垃圾回收算法使用了根集(rootset)這個(gè)概念(有了這個(gè)概念應(yīng)該就能解決面試中被問(wèn)到的互為引用的孤獨(dú)島的情況);所謂根集就是正在執(zhí)行的java程序可以訪問(wèn)的引用變量的集合(包括局部變量、參數(shù)、類變量),程序可以使用引用變量訪問(wèn)對(duì)象的屬性和調(diào)用對(duì)象的方法。垃圾收集首選需要確定從根開(kāi)始哪些是可達(dá)的和哪些是不可達(dá)的,從根集可達(dá)的對(duì)象都是活動(dòng)對(duì)象,它們不能作為垃圾被回收,這也包括從根集間接可達(dá)的對(duì)象。而根集通過(guò)任意路徑不可達(dá)的對(duì)象符合垃圾收集的條件,應(yīng)該被回收。下面介紹幾個(gè)常用的算法。

1、引用計(jì)數(shù)法(referencecountingcollector)

引用計(jì)數(shù)法是唯一沒(méi)有使用根集的垃圾回收得法,該算法使用引用計(jì)數(shù)器來(lái)區(qū)分存活對(duì)象和不再使用的對(duì)象。一般來(lái)說(shuō),堆中的每個(gè)對(duì)象對(duì)應(yīng)一個(gè)引用計(jì)數(shù)器。當(dāng)每一次創(chuàng)建一個(gè)對(duì)象并賦給一個(gè)變量時(shí),引用計(jì)數(shù)器置為1。當(dāng)對(duì)象被賦給任意變量時(shí),引用計(jì)數(shù)器每次加1。當(dāng)對(duì)象出了作用域后(該對(duì)象丟棄不再使用),引用計(jì)數(shù)器減1,一旦引用計(jì)數(shù)器為0,對(duì)象就滿足了垃圾收集的條件。

基于引用計(jì)數(shù)器的垃圾收集器運(yùn)行較快,不會(huì)長(zhǎng)時(shí)間中斷程序執(zhí)行,適宜地必須實(shí)時(shí)運(yùn)行的程序。但引用計(jì)數(shù)器增加了程序執(zhí)行的開(kāi)銷,因?yàn)槊看螌?duì)象賦給新的變量,計(jì)數(shù)器加1,而每次現(xiàn)有對(duì)象出了作用域生,計(jì)數(shù)器減1。

2、tracing算法(tracingcollector)

tracing算法是為了解決引用計(jì)數(shù)法的問(wèn)題而提出,它使用了根集的概念?;趖racing算法的垃圾收集器從根集開(kāi)始掃描,識(shí)別出哪些對(duì)象可達(dá),哪些對(duì)象不可達(dá),并用某種方式標(biāo)記可達(dá)對(duì)象,例如對(duì)每個(gè)可達(dá)對(duì)象設(shè)置一個(gè)或多個(gè)位。在掃描識(shí)別過(guò)程中,基于tracing算法的垃圾收集也稱為標(biāo)記和清除(mark-and-sweep)垃圾收集器.

3、compacting算法(compactingcollector)

為了解決堆碎片問(wèn)題,基于tracing的垃圾回收吸收了compacting算法的思想,在清除的過(guò)程中,算法將所有的對(duì)象移到堆的一端,堆的另一端就變成了一個(gè)相鄰的空閑內(nèi)存區(qū),收集器會(huì)對(duì)它移動(dòng)的所有對(duì)象的所有引用進(jìn)行更新,使得這些引用在新的位置能識(shí)別原來(lái)的對(duì)象。在基于 compacting算法的收集器的實(shí)現(xiàn)中,一般增加句柄和句柄表。

4、coping算法(copingcollector)

該算法的提出是為了克服句柄的開(kāi)銷和解決堆碎片的垃圾回收。它開(kāi)始時(shí)把堆分成一個(gè)對(duì)象面和多個(gè)空閑面,程序從對(duì)象面為對(duì)象分配空間,當(dāng)對(duì)象滿了,基于coping算法的垃圾收集就從根集中掃描活動(dòng)對(duì)象,并將每個(gè)活動(dòng)對(duì)象復(fù)制到空閑面(使得活動(dòng)對(duì)象所占的內(nèi)存之間沒(méi)有空閑洞),這樣空閑面變成了對(duì)象面,原來(lái)的對(duì)象面變成了空閑面,程序會(huì)在新的對(duì)象面中分配內(nèi)存。

一種典型的基于coping算法的垃圾回收是stop-and-copy算法,它將堆分成對(duì)象面和空閑區(qū)域面,在對(duì)象面與空閑區(qū)域面的切換過(guò)程中,程序暫停執(zhí)行。

5、generation算法(generationalcollector)

stop-and-copy垃圾收集器的一個(gè)缺陷是收集器必須復(fù)制所有的活動(dòng)對(duì)象,這增加了程序等待時(shí)間,這是coping算法低效的原因。在程序設(shè)計(jì)中有這樣的規(guī)律:多數(shù)對(duì)象存在的時(shí)間比較短,少數(shù)的存在時(shí)間比較長(zhǎng)。因此,generation算法將堆分成兩個(gè)或多個(gè),每個(gè)子堆作為對(duì)象的一代 (generation)。由于多數(shù)對(duì)象存在的時(shí)間比較短,隨著程序丟棄不使用的對(duì)象,垃圾收集器將從最年輕的子堆中收集這些對(duì)象。在分代式的垃圾收集器運(yùn)行后,上次運(yùn)行存活下來(lái)的對(duì)象移到下一最高代的子堆中,由于老一代的子堆不會(huì)經(jīng)常被回收,因而節(jié)省了時(shí)間。

6、adaptive算法(adaptivecollector)

在特定的情況下,一些垃圾收集算法會(huì)優(yōu)于其它算法。基于adaptive算法的垃圾收集器就是監(jiān)控當(dāng)前堆的使用情況,并將選擇適當(dāng)算法的垃圾收集器。

編輯推薦

java認(rèn)證考試基礎(chǔ)串講資料匯總

JAVA認(rèn)證考試報(bào)考指南 / 更多JAVA考試資料

(責(zé)任編輯:xy)

2頁(yè),當(dāng)前第1頁(yè)  第一頁(yè)  前一頁(yè)  下一頁(yè)
最近更新 考試動(dòng)態(tài) 更多>
岳普湖县| 安丘市| 青州市| 凤山市| 齐齐哈尔市| 保康县| 原阳县| 金山区| 三台县| 乐至县| 济阳县| 收藏| 天台县| 汉源县| 衡水市| 肥城市| 富顺县| 赞皇县| 铁岭市| 蓬安县| 西吉县| 霍城县| 墨玉县| 斗六市| 涿州市| 容城县| 苍南县| 辉南县| 抚宁县| 峨山| 治多县| 库尔勒市| 永川市| 沭阳县| 丰县| 延津县| 长阳| 嘉义县| 佛教| 读书| 车险|