JAVA記憶體回收Garbage Collection(二、垃圾收集器

來源:互聯網
上載者:User

標籤:garbage   適應   分享   優先   完成   收集   其他   image   開啟   

垃圾收集器

  • HotSpot虛擬機器的垃圾收集器
    •   Java虛擬機器規範中對垃圾收集器如何?沒有任何規定,因此不同版本的虛擬機器所提供的垃圾收集器都可能有很大的差別,並且都會提供參數供使用者自己應用的特點和要求組合出各個年代使用的收集器。java 1.7之後的Hotspot虛擬機器包含的收集器如下:
    •  

    • 新生代收集器:Serial ,ParNew,Parallel Scavenge
    • 老年代收集器:CMS,Serial Old,Parallel Old
    • 獨立堆收集器:G1
  • Serial收集器
    •   serial收集器是最基本發展曆史最悠久的收集器。在jdk1.3之前是虛擬機器新生代收集的唯一選擇。這個收集器是單線程收集器,但它單線程的意義並不僅僅說明它只會使用一個CPU或者一條收集線程去完成垃圾收集工作,更重要的是,它進行垃圾收集時,必須暫停其他所有的線程,之道它收集結束。"Stop The World"是這個收集器的特點。這個工作其實是由虛擬機器在後台自動發起自動完成的在使用者不可見的情況下把使用者正常工作的線程全部停掉對很多應用難以接受。但是虛擬機器Team Dev為消除或者背景工作執行緒因為記憶體回收而導致的停頓一直努力進行著,從serial到Parallel收集器到CMS再到G1,一個個越來越優秀的收集器出現,使用者線程停頓時間不斷縮短,但是仍然沒辦法消除。
    • serial優點:簡單高效,對單CPU的環境Serial收集器由於沒有線程互動的開銷,專心做垃圾收集自然可以獲得最高的單線程收集效率,在應用情境中分配給虛擬機器記憶體的一般不會很大,收集幾十上百兆的新生代時,停頓時間可以控制到幾十毫秒最多一百毫秒內只要不是頻繁發生這點停頓是可以接受的。所以serial在Client模式下的虛擬機器是個很好的選擇。
    •  

  • ParNew收集器
    •   ParNew收集器其實是Serial收集器的多線程版本,除了使用多線程進行記憶體回收外,其餘包括Serial收集器的所有可控參數,收集演算法,Stop The World 對象分配規則,回收策略都和Serial一樣。如下:
    •  

       

    • 目前只有ParNew收集器能和CMS收集器配合工作,成為Server模式下虛擬機器的首選新生代收集器。
  • Parallel  Scavenge收集器
    •   新生代收集器,使用的也是複製演算法Parallel Scavenge收集器的特點是它的關注點和其他收集器不同CMS等收集器的關注點是儘可能的縮短垃圾收集時使用者線程的停頓時間,而Parallel Scavenge收集器的目標則是達到一個可控的輸送量(ThroughPut)。輸送量:就是cpu用於運行使用者代碼的時間與cpu總消耗時間的比值,輸送量=運行使用者代碼時間/(運行使用者代碼時間+垃圾收集時間),虛擬機器運行了100分鐘,垃圾收集花掉1分鐘,輸送量就是99%。
      • Parallel Scavenge 收集器總共有兩個參數用以精確控制輸送量分別是:最大垃圾收集停頓時間-XX:MaxGCPauseMills,直接設定輸送量大小的-XX:GCTimeRatio
      • MaxGCPauseMills:GC停頓時間縮短是犧牲輸送量和新生代空間換來的,系統把新生代調小點,收集200M肯定比500M快,這也導致垃圾收集器更加頻繁的原來10s一次,每次100ms,現在是5s一次每次70ms。停頓時間下來了,吞吐 量也下來了。
      • GCTimeRatio:0-100的整數,垃圾收集時間佔總時間的佔比,就是輸送量的倒數;如預設是99 就是佔用1%(1/(99+1))的垃圾收集時間;
      • -XX:+UseAdaptiveSizePolicy:開啟後不需要手動設定Eden Survivor比例,老年代對象大小的細節參數,續集及會動態調整這些參數以提供最適合的停頓時間或者最大的輸送量。自適應調節也是與ParNew收集器的重要區別。
  • Serial Old
    •   serial的老年代版本,單線程收集器使用標記-整理演算法,主要在Client模式下的虛擬機器下使用
    •   JDK1.5之前與Parallel Scavenge收集器搭配使用,CMS的後備預案
  • Parallel Old
    •   Parallel Scavenge收集器的老年代版本,使用多線程和標記整理演算法。
    •        新生代如果選擇了Parallel Scavenge收集器,老年代只能使用Serial Old,有了Parallel Old出現後,在注重輸送量和CPU敏感的資源場合可以優先使用Parallel Scavenge和Parallel Old組合。
    •  

  • CMS(Concurrent Mark Sweep)
    •   

       

  • G1(Garbage First)
    • G1收集器是一款面向服務端應用的垃圾收集器
      • 並行與並發:G1能充分利用多CPU多核環境下的硬體優勢,使用多個CPU來縮短Stop-The-World的時間
      • 分代收集:G1收集器可收集新生代老年代兩種,不需要其他收集器配合就可以獨立管理整個GC堆
      • 空間整合:G1採用"標記-整理"演算法實現收集器,意味著G1運作期間不會產生記憶體空間片段,收集後可提供規整的可用記憶體
      • 可預測的停頓:建立可預測的停頓時間模型,能讓使用者明確指定一個長度為M毫秒的時間片段內,消耗在垃圾收集器上的時間不得超過N毫秒
    •  

       

JAVA記憶體回收Garbage Collection(二、垃圾收集器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.