年輕代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java類的類信息,與垃圾收集器要收集的Java對象關係不大。因此,年輕代和年老代的劃分纔是對垃圾 收集影響比較大的。對象
全部新生成的對象首先都是放在年輕代的。年輕代的目標就是儘量快速的收集掉那些生命週期短的對象。年輕代分三個區。一個Eden區,兩個 Survivor區(通常而言)。 大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被複制到Survivor區(兩個中的一個),當一個Survivor區滿 時,此區的存活對象將被複制到另一個Survivor區,當另外一個Survivor區也滿了的時候,從前一個Survivor區複製過來的而且此時還存 活的對象,將被複制「年老區(Tenured)」。 須要注意,兩個Survivor區是對稱的,沒前後關係,因此同一個Survivor區中可能同時存在從Eden區複製過來對象,和從另外一個 Survivor區複製過來的對象;而複製到年老區的只有從前一個Survivor區(相對的)過來的對象。並且,Survivor區總有一個是空的。特 殊的狀況下,根據程序須要,Survivor區是能夠配置爲多個的(多於兩個),這樣能夠增長對象在年輕代中的存在時間,減小被放到年老代的可能。生命週期
在年輕代中經歷了N(可配置)次垃圾回收後仍然存活的對象,就會被放到年老代中。所以,能夠認爲年老代中存放的都是一些生命週期較長的對象。內存
用於存放靜態數據,如 Java Class, Method 等。持久代對垃圾回收沒有顯著影響,可是有些應用可能動態生成或者調用一些Class,例如 Hibernate 等,在這種時候須要設置一個比較大的持久代空間來存放這些運行過程當中動態增長的類型。持久代大小經過 -XX:MaxPermSize= 進行設置。io