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