創(chuàng)新互聯(lián)www.cdcxhl.cn八線(xiàn)動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買(mǎi)多久送多久,劃算不套路!
站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到潮南網(wǎng)站設(shè)計(jì)與潮南網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋潮南地區(qū)。這篇文章將為大家詳細(xì)講解有關(guān)深入淺析JVM中的垃圾收集器,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
說(shuō)起垃圾收集(Garbage Collection,GC),大部分人都把這項(xiàng)技術(shù)當(dāng)做Java語(yǔ)言的伴生產(chǎn)物。事實(shí)上,GC的歷史遠(yuǎn)比Java久遠(yuǎn),1960年誕生于MIT的Lisp是第一門(mén)真正使用內(nèi)存動(dòng)態(tài)分配和垃圾收集技術(shù)的語(yǔ)言。當(dāng)List還在胚胎時(shí)期時(shí),人們就在思考GC需要完成的3件事情:
一、哪些內(nèi)存需要回收?
從JVM區(qū)域結(jié)構(gòu)看,可將這些區(qū)域劃分為“靜態(tài)內(nèi)存”和“動(dòng)態(tài)內(nèi)存”兩類(lèi)。程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法3個(gè)區(qū)域是“靜態(tài)”的,因?yàn)檫@幾個(gè)區(qū)域的內(nèi)存分配和回收都具備確定性,都隨著線(xiàn)程而生,隨著線(xiàn)程而滅。但Java堆和方法區(qū)不一樣,內(nèi)存分配都存在不確定性,只有在程序處于運(yùn)行期間才能知道會(huì)創(chuàng)建哪些對(duì)象,這部分內(nèi)存和回收都是動(dòng)態(tài)的,垃圾收集器所關(guān)注的是這部分內(nèi)存。
在堆里面存放著Java世界幾乎所有的對(duì)象實(shí)例,垃圾回收器在對(duì)堆進(jìn)行回收前,第一件事情就是就是要確定這些對(duì)象哪些還"存活"著,哪些已經(jīng)"死去"。那么又怎么確定對(duì)象已經(jīng)"死去"呢?
1.引用計(jì)數(shù)法:
分配對(duì)象時(shí)給對(duì)象添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器值就加1;當(dāng)引用失效時(shí),計(jì)數(shù)器值就減1;任何時(shí)刻計(jì)數(shù)器為0的對(duì)象就是沒(méi)有再被使用了??陀^地說(shuō),引用計(jì)數(shù)法(Reference Counting)的實(shí)現(xiàn)簡(jiǎn)單,判斷效率也很高,但是在主流的Java虛擬機(jī)里面沒(méi)有選用引用計(jì)數(shù)法來(lái)管理內(nèi)存,其中最主要的原因是它很難解決對(duì)象之間相互循環(huán)引用的問(wèn)題。例如:
public class ReferenceCountingGC { public Object instance = null; private byte[] bigsize = new byte[2*1024*1024]; public static void testGC(){ ReferenceCountingGC objA = new ReferenceCountingGC(); ReferenceCountingGC objB = new ReferenceCountingGC(); objA.instance = objB; objB.instance = objA; objA = null; objB = null; System.gc(); } }