分代的垃圾回收策略
基於對對象聲明週期分析後得出的垃圾回收算法。
把對象分爲年輕代、年老代和持久代,對不同聲明週期的對象使用不同的算法
年輕代: 一個Eden區,兩個Survior區 ,使用複製回收算法
所有新生成的對象首先都是放置在年輕代(Eden區)的
年輕代的目標就是儘可能快速地收集掉那些生命週期短的對象
年輕代回收過程:
1. 當Eden區滿時,還存活的對象將被複製到其中一個Survivor區
2. 當這個Survior區滿時,此區的存活對象被複製到另外一個Survior區
3. 當第二個Survior區也滿的時候,還存活的對象(經歷了從Eden->Survior1->Survior2的對象)將被複制到老年區
通過配置Survior區的個數可以增加對象在年輕代中的存在時間,減少放到老年代的可能
-XX:SurvivorRatio=4
設置年輕代中Eden區與Survivor區的大小比值
本例比值爲4,則默認兩個Survivor區與一個Eden區的比值爲2:4,一個Survivor區佔整個年輕代的1/6
年老代:使用標記-清除算法
在年輕代中經歷了N次垃圾回收後仍然存活的對象。
可以認爲年老代中存放的都是一些生命週期較長的對象
持久代:
用於存放靜態文件:java類、方法等
持久代對垃圾回收沒有顯著影響
有些應用(如Hibernate)可能動態生成或者調用一些class,就需要設置一個比較大的持久代空間來存放這些運行過程中新增的類。
-XX:MaxPermSize=<N>來設置持久代大小