其中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