JVM垃圾回收机制学习
一、可回收對(duì)象判定方法
識(shí)別方式有兩種。一是,引用計(jì)數(shù)算法;二是,可達(dá)性分析。
第一種方法:引用計(jì)數(shù)算法。當(dāng)一個(gè)對(duì)象被引用時(shí),引用計(jì)數(shù)器加1,當(dāng)引用失效時(shí),引用計(jì)數(shù)器減1。當(dāng)一個(gè)對(duì)象的引用次數(shù)為0時(shí),表示這個(gè)對(duì)象是可以被回收的。這種方法的優(yōu)點(diǎn)是快和簡(jiǎn)單,只要將所有對(duì)象遍歷一遍便可,缺點(diǎn)是:如果對(duì)象之間存在循環(huán)引用,則無(wú)法回收。比如:對(duì)象A引用了B,B中也引用了A,如果除此之外沒(méi)有任何對(duì)象引用了A和B,很顯然AB是應(yīng)該被回收的,但是此時(shí)兩者的引用次數(shù)是1,這時(shí),JVM無(wú)法對(duì)AB進(jìn)行回收。
第二種方法:可達(dá)性分析。通過(guò)一系列被稱(chēng)為“gc roots”的對(duì)象作為起點(diǎn),從這些節(jié)點(diǎn)開(kāi)始向下進(jìn)行搜索,搜索所走過(guò)的路徑成為引用鏈。當(dāng)一個(gè)對(duì)象到“gc roots”之間沒(méi)有任何引用鏈相連時(shí),則該對(duì)象是不可達(dá)的,也就是可以回收的。這種方式可以解決循環(huán)調(diào)用的問(wèn)題,JVM中使用的是這種判定方法。
二、垃圾回收算法
垃圾回收算法有以下四種:
標(biāo)記-清除算法;
復(fù)制算法;
標(biāo)記-整理算法;
分代收集算法;
標(biāo)記-清除算法分為“標(biāo)記”和“清除”兩個(gè)階段,“標(biāo)記”階段將需要回收的對(duì)象標(biāo)記出來(lái),“清除”階段回收被標(biāo)記的對(duì)象。這是一種最基本的垃圾回收算法,后面很多種垃圾回收算法都是基于這種算法的不足改進(jìn)而得到的。這種回收方法的缺點(diǎn)是回收之后會(huì)產(chǎn)生大量?jī)?nèi)存碎片,因?yàn)榛厥者^(guò)程只是簡(jiǎn)單的釋放掉被標(biāo)記對(duì)象。內(nèi)存碎片太多的話,當(dāng)我們需要分配大內(nèi)存對(duì)象時(shí),無(wú)法找到連續(xù)的內(nèi)存空間,以致分配內(nèi)存失敗。
復(fù)制算法將內(nèi)存分成兩半,一半使用(在用內(nèi)存),一半不用(未用內(nèi)存)。標(biāo)記過(guò)程同上,只是在回收時(shí),把在用內(nèi)存中的未標(biāo)記對(duì)象復(fù)制到未用內(nèi)存中,然后把在用內(nèi)存統(tǒng)一全部回收。這種方法不會(huì)產(chǎn)生內(nèi)存碎片,但是相當(dāng)于把內(nèi)存容量減少了一半。在實(shí)際算法中,在用內(nèi)存和未用內(nèi)存往往不是對(duì)半分的,因?yàn)槿绻看吻謇淼臅r(shí)候,大部分對(duì)象都死了,只有少部分存活(實(shí)際上,下面的分代收集算法中的新生代就符合這樣的特點(diǎn)),那么,未用內(nèi)存只要很小就可以了。
標(biāo)記-整理算法也是由標(biāo)記-清除算法發(fā)展而來(lái),只是“清除”之后,會(huì)把內(nèi)存整理一遍,這樣就沒(méi)有碎片了。但是,這種算法要考慮一致性問(wèn)題,就是整理的過(guò)程中,標(biāo)記不能變動(dòng),這就相當(dāng)于虛擬機(jī)要暫停,等待內(nèi)存整理完畢再運(yùn)行,而整理過(guò)程還是挺耗時(shí)的。但是,如果對(duì)象存活的時(shí)間很長(zhǎng),存活率很高,每次清理都只有少部分對(duì)象死亡(實(shí)際上,下面的分代收集算法中的老生代就符合這樣的特點(diǎn)),那么,這種算法消耗的時(shí)間會(huì)大大減少。
分代收集算法,這是聽(tīng)得最多的一種算法了,就是將對(duì)象分為新生代和老生代,新生代對(duì)象的特點(diǎn)是存活時(shí)間短,存活率低,老生代剛好相反。根據(jù)新生代和老生代的特點(diǎn),對(duì)新生代使用復(fù)制算法,對(duì)老生代使用標(biāo)記整理算法。
總結(jié)
以上是生活随笔為你收集整理的JVM垃圾回收机制学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Model、ModelMap和Model
- 下一篇: 层级分类(续)-使用B-CNN(Bran