1. 程式人生 > >JVM垃圾算法及回收器

JVM垃圾算法及回收器

src 經驗 總結 還需 dia 實現 虛擬機 htm 基礎

說到JVM垃圾回收,我們通常會問三個問題,回收對象是什麽?什麽時候回收?怎麽回收?JVM垃圾回收主要回收的區域是Java堆,通過了解JVM內存結構,我們知道堆主要負責對象和數組的存儲。堆還可以進行細分。 一、堆內存分類 技術分享

技術分享 技術分享 1. 新生代 - 新對象進入新生代,新生代可以分為三個區域 eden -新對象首先進入的區域 from survior -新生代另外一個區域 to survior -同上 2. 老年代old generation -- 在新生代中經歷了N次垃圾回收後仍然存活的對象就會被放到老年代中。而且大對象直接進入老年代。 new出來的對象進入eden區。因為大部分對象都是朝生夕死,根據經驗分析,一般eden和survior的大小比為8:1。當eden滿了則進行一次minor GC,如果對象大小大於survior區大小則對象進入老年區。為什麽需要分代,因為如果不分的話對所有對象進行標記-清理的話,則效率較低,而且清理會使虛擬機暫停,影響性能。為什麽要有2個survior區,這是為了減少碎片的產生。當進行一次minorGC時,如果只有一個survior區,那麽會導致碎片產生。如果有2個survior的話,eden和一個survior的存活的對象一起復制到另外一個survior區,則沒有碎片 技術分享

技術分享 二、什麽時候回收 當堆內存不足時進行回收,這裏回收方式有2種 1. minor gc --新生代GC回收,速度快,頻率高 2. full gc觸發 --老年代GC回收,速度慢比minorGC慢10倍左右,頻率低 三、回收對象 1. 引用計數算法 基本原理:給對象中添加一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1。任何時刻計數器為0的對象就是不可能再被使用的 優點:簡單,高效 缺點: 很難處理循環引用 2. 可達性分析算法 基本原理:從GC Roots(每種具體實現對GC Roots有不同的定義)作為起點,向下搜索它們引用的對象,可以生成一棵引用樹,樹的節點視為可達對象,反之視為不可達 如何判斷對象已死 四、如何回收 1. 回收算法 1. 標記清除算法 (Mark-Sweep) 基本原理:從根節點開始,標記出所有可達的對象;然後清除所有未標記的對象 缺點:效率低,需要從頭到尾遍歷;產生較多不連續的碎片 2. 復制算法 (Copying) 基本原理:從根節點開始,標記出所有可達的對象;然後清除所有未標記的對象 優點:效率高,不用考慮碎片等復雜情況 缺點:只能用一半內存 3. 標記整理算法 (Mark-Compact) 基本原理:從根節點開始,標記出所有可達的對象;然後讓所有對象向一端移動,然後清理掉邊界以外的內存 優點:不會產生內存碎片 缺點:在標記的基礎之上還需要進行對象的移動,成本相對較高,效率也不高 4. 分代回收算法 2. 回收器 新生代回收器 Serial 單線程:簡單高效 ParNew Serial的多線程版本,能與CMS配合,不能與PS配合 Parallel Scavenge 復制算法,多線程並行,適合對響應時間要求較高的場景 老年代回收器 Serial Old 單線程,搭配PS Parallel Old PS的老年版 CMS 獲取最短時間為目標的收集器 G1 基於標記整理,能非常精確的控制java堆 《Java Garbage Collection Basics》 http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 《Java虛擬機詳解----JVM常見問題總結》 http://www.cnblogs.com/smyhvae/p/4810168.html

JVM垃圾算法及回收器