一、概念3d
JVM根據對象存活週期不一樣,把堆內存劃分爲年輕代、老年代、持久代。其中持久代主要存放的是Java類的類信息,與垃圾收集要收集的Java對象關係不大。年輕代和年老代的劃分是對垃圾收集影響比較大的。cdn
二、分代緣由對象
堆內存存放對象實例,是JVM管理的內存中最大一塊,也是垃圾回收最頻繁的一塊。分代是爲了提升對象內存分配和垃圾回收的效率。blog
三、堆(Heap)和非堆(Non-heap)內存生命週期
堆是在Java虛擬機啓動時建立的。在JVM中堆以外的內存稱爲非堆內存(Non-heap memory)」。 能夠看出JVM主要管理兩種類型的內存:堆和非堆。 簡單來講堆就是Java代碼可及的內存,是留給開發人員使用的;非堆就是JVM留給本身用的。內存
全部新生成的對象首先都是放在年輕代的。年輕代的目標就是儘量快速的收集掉那些生命週期短的對象。年輕代分三個區。一個Eden區,兩個Survivor區(通常而言)。 大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被複制到SurvivorA區(兩個中的一個),當SurvivorA區滿時,此區的存活對象將被複制到另一個SurvivorB區,當SurvivorB區也滿了的時候,從第一個SurvivorA區複製過來的而且此時還存活的對象,將被複制「年老區(Tenured)」。須要注意,Survivor的兩個區是對稱的,沒前後關係,因此同一個區中可能同時存在從Eden複製過來對象,和從前一個Survivor複製過來的對象,而複製到年老區的只有從第一個Survivor去過來的對象。並且,Survivor區總有一個是空的。同時,根據程序須要,Survivor區是能夠配置爲多個的(多於兩個),這樣能夠增長對象在年輕代中的存在時間,減小被放到年老代的可能。開發
默認的所佔空間比例年輕代(Young generation) :老年代(Old generation) = 1 :2虛擬機
一個伊甸園空間(Eden)和 兩個倖存者空間(SurvivorA、SurvivorB)it
默認新生代空間的分配:Eden : SurvivorA : SurvivorB = 8 : 1 : 1io
通過n次垃圾回收存活的對象(這個n被稱爲年齡閥值 ,默認是15次)。 老年代空間的構成其實很簡單,它不像新生代空間那樣劃分爲幾個區域,它只有一個區域,裏面存儲的對象並不像新生代空間絕大部分對象都是朝聞道,夕死矣。這裏的對象幾乎都是從Survivor 空間中熬過來的,它們毫不會輕易的狗帶。所以,Full GC(Major GC)發生的次數不會有Scanvage GC(Minor GC)那麼頻繁,而且作一次 Full GC 的時間比Scanvage GC 要更長(約10倍)。
JDK1.8後變成元空間,元空間再也不佔用堆中的空間。而持久代倒是在堆中開闢空間,用於存放靜態文件、類信息等,通常不作GC。