系統(tǒng)之家 - 系統(tǒng)光盤下載網(wǎng)站!

當(dāng)前位置:系統(tǒng)之家 > 系統(tǒng)教程 > Linux系統(tǒng)Dalvik堆內(nèi)存管理與回收

Linux系統(tǒng)Dalvik堆內(nèi)存的管理與回收介紹(2)

時間:2015-09-09 14:26:20 作者:zhijie 來源:系統(tǒng)之家 1. 掃描二維碼隨時看資訊 2. 請使用手機(jī)瀏覽器訪問: https://m.xitongzhijia.net/xtjc/20150909/57272.html 手機(jī)查看 評論

  Mark-Sweep算法分為兩個階段:

  Mark階段:通過遞歸對象的引用,從對象的根集開始標(biāo)記被引用的對象。

  Sweep階段:回收沒有被標(biāo)記的對象占用的內(nèi)存。

  Dalvik虛擬機(jī)通過Heap Bitmap來標(biāo)記標(biāo)記對象有沒有被引用。所謂Heap Bitmap就是一個unsigned long數(shù)組,如果一個對象被引用,那么在Bitmap中與它對應(yīng)的那一位就會被設(shè)置為1。否則的話,就設(shè)置為0。Dalvik使用了兩個Bitmap來描述堆的對象,一個稱為Live Bitmap,另一個稱為Mark Bitmap。Live Bitmap用來標(biāo)記上一次GC時被引用的對象,也就是沒有被回收的對象,而Mark Bitmap用來標(biāo)記當(dāng)前GC有被引用的對象。這樣只需要回收上一次被引用,當(dāng)前未被引用的對象就可以了。

  在垃圾收集的Mark階段,要求除了垃圾收集線程之外,其它的線程都停止(Stop The World),否則如果對象在GC過程中又引用了其他對象,就會可能導(dǎo)致不能正確地標(biāo)記每一個對象。然而,這將造成程序卡頓,效率降低。所以必須允許在Mark階段使垃圾回收線程和其他線程可以并發(fā)執(zhí)行(Concurrent GC)。

  為了實(shí)現(xiàn)此目的,Dalvik將Mark階段劃分為兩步:

  第一步,只標(biāo)記根集對象,即在GC過程開始的時刻,那些被全局變量,棧變量,寄存器對象引用的對象。這個階段只允許GC線程運(yùn)行,防止這些根集對象在這個過程中再去引用其他對象。

  第二步,通過這些根集對象引用關(guān)系,可以找到并標(biāo)記其他正在使用的對象。這個階段可以允許其他線程與GC線程并發(fā)執(zhí)行。為了實(shí)現(xiàn)GC線程與其他線程并發(fā),需要把其他線程對對象的修改記錄下來,記錄這些修改的數(shù)據(jù)結(jié)構(gòu)被稱為Card Table。

  Dalvik虛擬機(jī)進(jìn)行部分垃圾收集時,實(shí)際上就是只收集在Active堆上分配的對象。因此對Dalvik虛擬機(jī)來說,Card Table就是用來記錄在Zygote堆上分配的對象在部收垃圾收集執(zhí)行過程中對在Active堆上分配的對象的引用。

  與Bitmap不同,Card Table中每個card大小為一個字節(jié),如果與它對應(yīng)的對象在第二步未被修改過,其值為clean,否則為dirty。對于被修改過的對象,在第二步結(jié)束后需要重新使用GC線程排他地對這些對象進(jìn)行標(biāo)記。由于這些對象不是很多所以這個過程很快,這也是分兩步的原因。

  以上就是Linux系統(tǒng)Dalvik堆內(nèi)存的管理與回收的全部內(nèi)容了,所以Linux系統(tǒng)不僅可以把Dalvik當(dāng)做一個虛擬機(jī),還能把Dalvik作為有效的優(yōu)化工具。

標(biāo)簽 Dalvik

發(fā)表評論

0

沒有更多評論了

評論就這些咯,讓大家也知道你的獨(dú)特見解

立即評論

以上留言僅代表用戶個人觀點(diǎn),不代表系統(tǒng)之家立場

其他版本軟件

熱門教程

人氣教程排行

Linux系統(tǒng)推薦

掃碼關(guān)注
掃碼關(guān)注

掃碼關(guān)注 官方交流群 軟件收錄