對(duì)象存活判定算法
四種引用類型
1.強(qiáng)引用
2.弱引用
3.軟引用
4.虛引用
a.引用計(jì)數(shù)法: 給對(duì)象中添加一個(gè)引用計(jì)數(shù)器 每當(dāng)有一個(gè)地方引用它時(shí)嗤放,計(jì)算器值就加1
當(dāng)引用失效時(shí) 計(jì)算器值就減1 任何時(shí)候計(jì)數(shù)器為0 的對(duì)象就是不可能被再使用的
然而在主流的Java虛擬機(jī)里未選用引用計(jì)數(shù)算法來管理內(nèi)存,主要原因是它難以解決對(duì)象之間相互循環(huán)引用的問題晨雳,所以出現(xiàn)了另一種對(duì)象存活判定算法炉峰。
b.可達(dá)性分析法:通過一系列被稱為『GC Roots』的對(duì)象作為起始點(diǎn)肮塞,從這些節(jié)點(diǎn)開始向下搜索技扼,搜索所走過的路徑稱為引用鏈分飞,當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈相連時(shí),則證明此對(duì)象是不可用的享幽。
可作為GC Roots的對(duì)象:
虛擬機(jī)棧中引用的對(duì)象铲掐,主要是指棧幀中的本地變量
本地方法棧中Native方法引用的對(duì)象
方法區(qū)中類靜態(tài)屬性引用的對(duì)象
方法區(qū)中常量引用的對(duì)象
垃圾收集算法
1.分代收集算法
根據(jù)對(duì)象存活周期的不同 將java堆分為新生代和老年代,并根據(jù)各個(gè)年代的特點(diǎn) 采用最適合的收集算法
新生代:大批對(duì)象死去,只有少量存活 使用復(fù)制算法 只需要復(fù)制少量存活對(duì)象即可值桩。
老年代:對(duì)象存活率高摆霉。使用標(biāo)記-清理算法或者標(biāo)記-整理算法 只需要標(biāo)記較少的回收對(duì)象即可。
2.復(fù)制算法
把可用內(nèi)存按容量劃分為大小相等的兩塊奔坟,每次只使用其中的一塊携栋。當(dāng)這一塊的內(nèi)存用盡后,把還存活著的對(duì)象『復(fù)制』到另外一塊上面咳秉,再將這一塊內(nèi)存空間一次清理掉婉支。
優(yōu)點(diǎn):每次都是對(duì)整個(gè)半?yún)^(qū)進(jìn)行內(nèi)存回收,無需考慮內(nèi)存碎片等復(fù)雜情況澜建,只要移動(dòng)堆頂指針向挖,按順序分配內(nèi)存即可,實(shí)現(xiàn)簡單炕舵,運(yùn)行高效何之。
缺點(diǎn):每次可使用的內(nèi)存縮小為原來的一半,內(nèi)存使用率低咽筋。
3.標(biāo)記-清除算法
首先『標(biāo)記』出所有需要回收的對(duì)象溶推,然后統(tǒng)一『清除』所有被標(biāo)記的對(duì)象。 是最基礎(chǔ)的收集算法奸攻。
缺點(diǎn):『標(biāo)記』和『清除』過程的效率不高蒜危;空間碎片太多,『標(biāo)記』『清除』之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片舞箍,可能會(huì)導(dǎo)致后續(xù)需要分配較大對(duì)象時(shí)舰褪,因無法找到足夠的連續(xù)內(nèi)存而提前觸發(fā)另一次GC皆疹,影響系統(tǒng)性能疏橄。?
?4.標(biāo)記整理算法
首先『標(biāo)記』出所有需要回收的對(duì)象,然后進(jìn)行『整理』略就,使得存活的對(duì)象都向一端移動(dòng)捎迫,最后直接清理掉端邊界以外的內(nèi)存。
優(yōu)點(diǎn):即沒有浪費(fèi)50%的空間表牢,又不存在空間碎片問題窄绒,性價(jià)比較高。一般情況下崔兴,老年代會(huì)選擇標(biāo)記-整理算法彰导。