垃圾收集的目的在于清除不再使用的對象,釋放那些不再使用的對象所占用的內(nèi)存。GC兩種常用的方法是引用計數(shù)和對象引用遍歷,早期的jvm使用引用計數(shù),現(xiàn)在大多數(shù)jvm采用對象引用遍歷。
1、對象引用計數(shù):
當(dāng)應(yīng)用程序創(chuàng)建引用以及引用超出作用域(范圍)時,jvm必須適當(dāng)增減引用數(shù)。當(dāng)某對象的引用數(shù)為0時,對象便可以進(jìn)行垃圾收集。
2、對象引用遍歷:
(1)、標(biāo)記(marking)對象:從一組對象開始,沿著整個對象圖上的引用鏈,遞歸確定可到達(dá)的對象,GC將標(biāo)記這些可到達(dá)的對象。如果某對象不能從這些根對象的一個(至少一個)到達(dá),則表示它可被收集。
(2)、清除(sweeping)對象:GC刪除不可到達(dá)的對象,刪除時,有些GC只是簡單的掃描堆棧,刪除未標(biāo)記的對象,并釋放它們的內(nèi)存以生成新的對象。這種方法的問題在于內(nèi)存會分成好多小段,而它們不足以用于新的對象,但是組合起來卻很大。因此,許多gc可以重新組織內(nèi)存中的對象,并進(jìn)行壓縮(compact),形成可利用的空間。
posted on 2010-09-25 12:13
josson 閱讀(249)
評論(0) 編輯 收藏 所屬分類:
java 開發(fā)