Oracle HotSpot虛擬機的JVM棧和方法區實現

Java Heap和Method Area是JVM中內存佔用最大的區域,也是監控和調優的重點。
下圖使用jvisualvm工具截取,Perm是永久代(Permanent Generation)、Old是年老代(Old Generation)、Eden Space 和S0+S1是年輕代(Young Generation,日誌等處稱之爲New的也指這裏), S0(也稱From)和S1(也稱To)合稱Survivor Space。

其中Permanent Generation對應Java虛擬機規範中的Method Area,Old Generation和Young Generation對應JVM Heap。 工具

對象主要在年輕代的Eden區分配(不討論JIT編譯),其實堆也不徹底是線程共享,若是啓用了本地線程分配緩衝,優先在線程的TLAB上分配,這個TLAB每一個線程本身獨佔。少數狀況下,也可能會直接分配在年老代。整體上遵照幾個規則: spa

一、對象優先在Eden區分配,Eden區空間不足時發起Minor GC,將Eden區和正在使用的一個Survivor區對象轉移到另外一個Survivor區,如目標Survivor區空間不足,轉移到年老代。 線程

二、須要大量連續內存空間的Java大對象,若是超過設定的閾值,將直接在年老代分配。 日誌

三、對象每被移動到Survivor區一次年齡加1,超過設定的閾值仍然存活,將被移動到年老代。 對象

四、Minor GC前,虛擬機會判斷年老代是否有連續空間容納新生代要轉移的對象,若是沒有,根據參數設置可能引起年老代Major GC。 內存

Minor GC,指新生代GC,發生頻率高速度快。 虛擬機

Major GC,也稱Full GC,指年老代GC,發生頻率低速度慢,通常比Minor GC慢10倍以上。 io

相關文章
相關標籤/搜索