一.概述
成都創(chuàng)新互聯(lián)公司專業(yè)IDC數(shù)據(jù)服務(wù)器托管提供商,專業(yè)提供成都服務(wù)器托管,服務(wù)器租用,托管服務(wù)器,托管服務(wù)器,成都多線服務(wù)器托管等服務(wù)器托管服務(wù)。相比起C和C++的自己回收內(nèi)存,JAVA要方便得多,因?yàn)镴VM會(huì)為我們自動(dòng)分配內(nèi)存以及回收內(nèi)存。
在之前的JVM 之內(nèi)存管理 中,我們介紹了JVM內(nèi)存管理的幾個(gè)區(qū)域,其中程序計(jì)數(shù)器以及虛擬機(jī)棧是線程私有的,隨線程而滅,故而它是不用考慮垃圾回收的,因?yàn)榫€程結(jié)束其內(nèi)存空間即釋放。
而JAVA堆和方法區(qū)則不一樣,JAVA堆和方法區(qū)時(shí)存放的是對(duì)象的實(shí)例信息以及對(duì)象的其他信息,這部分是垃圾回收的主要地點(diǎn)。
二.JAVA堆垃圾回收
垃圾回收主要考慮的問(wèn)題有兩個(gè):一個(gè)是效率問(wèn)題,一個(gè)是空間碎片問(wèn)題。
而Java堆中的垃圾回收可以分為兩個(gè)區(qū)域,一個(gè)是新生代,一個(gè)是老年代。其中新生代又分為一塊比較大的Eden空間和兩塊較小的Survivor空間。因?yàn)樾律屠夏甏鎯?chǔ)的對(duì)象群體是不一樣的,為了在效率和空間碎片問(wèn)題中取得平衡,新生代和老年代所使用的垃圾回收算法是不一樣。
新生代 -復(fù)制算法
從名字上就知道,新生代主要存放的是比較新的對(duì)象,回收多次之后仍然存活的對(duì)象,就會(huì)被送到老年代中區(qū)。由此可知新生代的垃圾回收是比較頻繁的,所以為解決效率問(wèn)題,新生代使用了復(fù)制算法。復(fù)制算法可以將內(nèi)存分為大小相等的兩塊,每次分配時(shí)使用其中一塊,當(dāng)這一塊用完時(shí),就將還存活的對(duì)象復(fù)制到另一塊內(nèi)存上面區(qū)。此時(shí)已使用過(guò)的這一塊內(nèi)存就可以一次清理掉,這樣也不用擔(dān)心內(nèi)存碎片的問(wèn)題。當(dāng)然這種算法的一個(gè)缺點(diǎn)就是內(nèi)存使用率比較低,只有一半(每次只能一半用來(lái)分配出去)。
而IBM公司的研究表明,新生代中的對(duì)象98%都是”照生夕死“,所以不需要按照1:1劃分,故而會(huì)將內(nèi)存分為一塊較大的Eden空間和兩塊小的Survivor空間。
那么為什么會(huì)有兩塊Survivor呢,復(fù)制算法不是只需要一塊Eden和一塊Survivor就夠了嗎?
其實(shí)這主要還是為了解決碎片化的問(wèn)題。假設(shè)只有一個(gè)Survivor區(qū),當(dāng)Eden區(qū)滿的時(shí)候,進(jìn)行Gc,存活對(duì)象被分配到了Survivor區(qū),清空Eden區(qū)。當(dāng)再一次Gc完成后,存活的對(duì)象繼續(xù)放在Survivor區(qū),這樣不是很美好嗎,不會(huì)有內(nèi)存碎片?。〉莿e忘了,第一次存到Survivor區(qū)的對(duì)象很可能在第二次Gc的時(shí)候就失活了,清理掉Survivor失活對(duì)象不就會(huì)產(chǎn)生內(nèi)存碎片了嗎?
所以Java堆使用了兩個(gè)Survivor區(qū),一個(gè)from Survivro和一個(gè)toSurvivor,第一次Eden滿的時(shí)候,復(fù)制算法將存活對(duì)象放到from Survivor區(qū),清空Eden。第二次,Eden滿時(shí),將Eden和from Survivor區(qū)存活的對(duì)象放到to Survivor區(qū),清空Eden和from Survivor,然后重要的一步,將from Survivor和to Survivor角色互換!這樣就解決了內(nèi)存碎片化的問(wèn)題。
老年代 -標(biāo)記/整理算法
首先要明白老年代存放的都是會(huì)存活得比較久的對(duì)象,所以如果老年代也使用復(fù)制算法的話,那么復(fù)制對(duì)象的開(kāi)銷時(shí)比較大的,因?yàn)槔夏甏膶?duì)象基本上都會(huì)存活。
標(biāo)記/整理算法很好理解,主要也就是”標(biāo)記“,”整理“兩個(gè)步驟,先將要回收的對(duì)象標(biāo)記,然后讓存活對(duì)象向著一端移動(dòng),最后將邊界以外的內(nèi)存,然后Gc完成。
三.方法區(qū)垃圾回收
在某些地方的解釋中,方法區(qū)也會(huì)被叫做“永久代”,與JAVA堆不同,這里存放的是類的信息以及一些常量信息,故而這個(gè)區(qū)域中被分配的內(nèi)存一般比較難以被回收,所以才有有”永久代“之名。
雖然方法區(qū)中垃圾回收效率較低,但被分配的內(nèi)存卻也并非真的就永不被回收,其主要回收的有兩部分內(nèi)容:廢棄常量和無(wú)用的類。廢棄常量的回收與JAVA堆中類實(shí)例回收類似,當(dāng)常量池中一個(gè)常量沒(méi)有被引用時(shí),就有可能被回收。比如常量池中有一個(gè)字符串常量“abc”,當(dāng)沒(méi)有任何一個(gè)String對(duì)象值為"abc"時(shí),那么下一次垃圾回收"abc"常量就有可能會(huì)被回收。
而對(duì)于無(wú)用的類的回收,首先需要判斷什么樣的類才是”無(wú)用的類“:
虛擬機(jī)可能會(huì)堆滿足這三個(gè)條件的”無(wú)用的類“進(jìn)行回收,僅僅是可能,并非必然。
網(wǎng)站欄目:詳解Java內(nèi)存管理中的JVM垃圾回收-創(chuàng)新互聯(lián)
文章地址:http://www.rwnh.cn/article24/gegje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、商城網(wǎng)站、面包屑導(dǎo)航、外貿(mào)建站、外貿(mào)網(wǎng)站建設(shè)、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容