jvm空间分配担保机制
新生代Minor GC后剩余存活對象太多,無法放入Survivor區(qū)中,此時就必須將這些存活對象直接轉(zhuǎn)移到老年代去,如果此時老年代空間也不夠怎么辦?
1、執(zhí)行任何一次Minor GC之前,JVM會先檢查一下老年代可用內(nèi)存空間,是否大于新生代所有對象的總大小,因為在極端情況下,可能新生代Minor GC之后,新生代所有對象都需要存活,那就會造成新生代所有對象全部要進(jìn)入老年代;
2、如果老年代的可用內(nèi)存大于新生代所有對象總大小,此時就可以放心大膽的對新生代發(fā)起一次Minor GC,因為Minor GC之后即使所有對象都存活,Survivor區(qū)放不下了,也可以轉(zhuǎn)移到老年代去;
3、如果執(zhí)行Minor GC之前,檢測發(fā)現(xiàn)老年代的可用空間已經(jīng)小于新生代的全部對象總大小,那么就會進(jìn)行下一個判斷,判斷老年代的可用空間大小,是否大于之前每一次Minor GC后進(jìn)入老年代的對象的平均大小,如果小于,這時要進(jìn)行一次Full GC。如果判斷發(fā)現(xiàn)老年代的內(nèi)存大小,大于之前每一次Minor GC后進(jìn)入老年代的對象的平均大小,那么就是說可以冒險嘗試一下Minor GC,但是此時真的可能有風(fēng)險,那就是Minor GC過后,剩余的存活對象的大小,大于Survivor空間的大小,也大于老年代可用空間的大小,老年代都放不下這些存活對象了,此時就會觸發(fā)一次“Full GC”;
所以老年代空間分配擔(dān)保機制的目的?也是為了避免頻繁進(jìn)行Full GC;
4、如果Full GC之后,老年代還是沒有足夠的空間存放Minor GC過后的剩余存活對象,那么此時就會導(dǎo)致“OOM”內(nèi)存溢出 ;
總結(jié)
以上是生活随笔為你收集整理的jvm空间分配担保机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM - 常见的JVM种类
- 下一篇: JVM内存相关的核心参数?