您好,登錄后才能下訂單哦!
JVM里的GC(GarbageCollection)的算法有很多種,如標(biāo)記清除收集器,壓縮收集器,分代收集器等等,詳見(jiàn)HotSpotVMGC的種類
現(xiàn)在比較常用的是分代收集,即將內(nèi)存分為幾個(gè)區(qū)域,將不同生命周期的對(duì)象放在不同區(qū)域里:younggeneration,tenuredgeneration和permanetgeneration。絕大部分的objec被分配在younggeneration(生命周期短),并且大部分的object在這里die。當(dāng)younggeneration滿了之后,將引發(fā)minorcollection(YGC)。在minorcollection后存活的object會(huì)被移動(dòng)到tenuredgeneration(生命周期比較長(zhǎng))。最后,tenuredgeneration滿之后觸發(fā)majorcollection。majorcollection(Fullgc)會(huì)觸發(fā)整個(gè)heap的回收,包括回收younggeneration。permanetgeneration區(qū)域比較穩(wěn)定,主要存放classloader信息。
younggeneration有eden、2個(gè)survivor區(qū)域組成。其中一個(gè)survivor區(qū)域一直是空的,是eden區(qū)域和另一個(gè)survivor區(qū)域在下一次copycollection后活著的objecy的目的地。object在survivo區(qū)域被復(fù)制直到轉(zhuǎn)移到tenured區(qū)。
我們要盡量減少Fullgc的次數(shù)(tenuredgeneration一般比較大,收集的時(shí)間較長(zhǎng),頻繁的Fullgc會(huì)導(dǎo)致應(yīng)用的性能收到嚴(yán)重的影響)。
堆內(nèi)存GC
JVM(采用分代回收的策略),用較高的頻率對(duì)年輕的對(duì)象(younggeneration)進(jìn)行YGC,而對(duì)老對(duì)象(tenuredgeneration)較少(tenuredgeneration滿了后才進(jìn)行)進(jìn)行FullGC。這樣就不需要每次GC都將內(nèi)存中所有對(duì)象都檢查一遍。
非堆內(nèi)存不GC
GC不會(huì)在主程序運(yùn)行期對(duì)PermGenSpace進(jìn)行清理,所以如果你的應(yīng)用中有很多CLASS(特別是動(dòng)態(tài)生成類,當(dāng)然permgenspace存放的內(nèi)容不僅限于類)的話,就很可能出現(xiàn)PermGenSpace錯(cuò)誤。
內(nèi)存申請(qǐng)、對(duì)象衰老過(guò)程
一、內(nèi)存申請(qǐng)過(guò)程
JVM會(huì)試圖為相關(guān)Java對(duì)象在Eden中初始化一塊內(nèi)存區(qū)域;
當(dāng)Eden空間足夠時(shí),內(nèi)存申請(qǐng)結(jié)束。否則到下一步;
JVM試圖釋放在Eden中所有不活躍的對(duì)象(minorcollection次收集),釋放后若Eden空間仍然不足以放入新對(duì)象,則試圖將部分Eden中活躍對(duì)象放入Survivor區(qū);
Survivor區(qū)被用來(lái)作為Eden及old的中間交換區(qū)域,當(dāng)OLD區(qū)空間足夠時(shí),Survivor區(qū)的對(duì)象會(huì)被移到Old區(qū),否則會(huì)被保留在Survivor區(qū);
當(dāng)old區(qū)空間不夠時(shí),JVM會(huì)在old區(qū)進(jìn)行majorcollection(完全收集);
完全垃圾收集后,若Survivor及old區(qū)仍然無(wú)法存放從Eden復(fù)制過(guò)來(lái)的部分對(duì)象,導(dǎo)致JVM無(wú)法在Eden區(qū)為新對(duì)象創(chuàng)建內(nèi)存區(qū)域,則出現(xiàn)"Outofmemory錯(cuò)誤";
二、對(duì)象衰老過(guò)程
新創(chuàng)建的對(duì)象的內(nèi)存都分配自eden。Minorcollection的過(guò)程就是將eden和在用survivorspace中的活對(duì)象copy到空閑survivorspace中。對(duì)象在younggeneration里經(jīng)歷了一定次數(shù)(可以通過(guò)參數(shù)配置)的minorcollection后,就會(huì)被移到oldgeneration中,稱為tenuring。
GC觸發(fā)條件
GC類型 | 觸發(fā)條件 | 觸發(fā)時(shí)發(fā)生了什么 | 注意 | 查看方式 |
YGC | eden空間不足 | 清空Eden+fromsurvivor中所有noref的對(duì)象占用的內(nèi)存 重新調(diào)整Eden和from的大小(parallelGC會(huì)觸發(fā)此項(xiàng)) | 全過(guò)程暫停應(yīng)用 是否為多線程處理由具體的GC決定 | jstat–gcutil gclog |
FGC | old空間不足 | 清空heap中noref的對(duì)象 permgen中已經(jīng)被卸載的classloader中加載的class信息 如配置了CollectGenOFirst,則先觸發(fā)YGC(針對(duì)serialGC) 如配置了ScavengeBeforeFullGC,則先觸發(fā)YGC(針對(duì)serialGC) | 全過(guò)程暫停應(yīng)用 是否為多線程處理由具體的GC決定 是否壓縮需要看配置的具體GC | jstat–gcutil gclog |
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。