關鍵字約定java
全部新生成的對象首先都是放在年輕代的。年輕代的目標就是儘量快速的收集掉那些生命週期短的對象。年輕代分三個區。一個Eden區,兩個 Survivor區(通常而言)。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被複制到Survivor區(兩個中的一個),當這個 Survivor區滿時,此區的存活對象將被複制到另一個Survivor區,當這個Survivor去也滿了的時候,從第一個Survivor區複製過來的而且此時還存活的對象,將被複制「年老區(Tenured)」。須要注意,Survivor的兩個區是對稱的,沒前後關係,因此同一個區中可能同時存在從Eden複製過來對象,和從前一個Survivor複製過來的對象,而複製到年老區的只有從第一個Survivor去過來的對象。並且,Survivor區總有一個是空的。同時,根據程序須要,Survivor區是能夠配置爲多個的(多於兩個),這樣能夠增長對象在年輕代中的存在時間,減小被放到年老代的可能。算法
在年輕代中經歷了N次垃圾回收後仍然存活的對象,就會被放到年老代中。所以,能夠認爲年老代中存放的都是一些生命週期較長的對象。多線程
用於存放靜態文件,現在Java類、方法等。永久代對垃圾回收沒有顯著影響,可是有些應用可能動態生成或者調用一些class,例如Hibernate 等,在這種時候須要設置一個比較大的永久代空間來存放這些運行過程當中新增的類。永久代大小經過-XX:MaxPermSize=<N>進行設置。性能
包括 | 垃圾回收算法 | |
年輕代 | Eden區、s0、s1區 | 複製算法 |
老年代 | 標記壓縮 |
一、通常來講,對象達到必定年齡後就會進入老年代,對象的年齡是由gc的次數決定的,在新生代中,每gc一次,對象若是沒有被回收的化年齡就會+1。優化
二、大對象(新生代Eden區沒法裝入時,會直接進入老年代)。spa
一、複製算法:其核心思想就是將內存個空間分爲兩塊,每次只使用其中一塊,在垃圾回收時,在垃圾回收時,將正在使用的內存中的存留對象複製到未被使用的內存塊中去,以後去清除以前正在使用的內存塊中全部的對象,反覆去交換兩個內存的角色,完成垃圾收集。java中新生代from和to空間就是使用這個算法。線程
二、標記壓縮算法:標記壓縮法在標記清除法基礎上作了優化,把存活的對象壓縮到內存一端,然後進行垃圾清理。Java老年代使用的就是標記壓縮算法。code
使用單線程進行垃圾回收的回收器。每次回收時,串行回收器只有一個工做線程,對於並行能力較弱的計算機來講,串行回收器的專一性和獨佔性每每有更好的性能表現。對象
串行回收器能夠在新生代和老年代使用,根據做用於不一樣的堆空間,分爲新生代串行回收器和老年代串行回收器。生命週期
經過JVM參數-XX:+UseSerialGC
能夠設置新生代串行垃圾回收器和老年代串行垃圾回收器。
並行回收器在串行回收器的基礎上作了改進,他可使用多線程同時進行垃圾回收,對於計算能力強的計算機而言,能夠有效的縮短垃圾回收所需的實際時間。
parNew回收器是一個工做在新生代的垃圾回收器,他只是簡單的將串行回收器多線程化,他的回收策略和算法和串行回收器同樣。
經過JVM參數-XX:+UseParNewGC新生代ParNew回收器,老年代則使用串行回收器。
ParNew回收器工做時的線程數量可使用-XX:ParallelGCThreads參數指定,通常最好和計算機的CPU至關,避免過多的線程影響性能。