深刻解析Java虛擬機

垃圾收集器

      手機算法是內存回收的方法論,垃圾收集器是內存回收的具體實現。算法

      並行:指多條垃圾收集線程並行工做,但此時用戶線程仍然處於等待狀態多線程

      併發:值用戶線程與垃圾收集線程同時執行(但並不必定是並行的),用戶程序在繼續運行,而垃圾收集程序運行於另外一個CPU上。集器併發

      單線程收集器,也就是說是必須中止全部的工做線程,知道垃圾收集完畢。對於單CPU來講更加高效。因此適合運行於Client模式下的虛擬機。     性能

      新生代採用複製算法。老年代採用標記整理算法。優化

ParNew收集器

      是Serial的多線程版本(看圖的話是在新生代多線程同時進行GC)。是GC線程有多個,全部其餘工做線程都中止。多線程GC會有線程間交互這種上下文切換的效率損失。spa

      新生代採用複製算法。老年代採用標記整理算法。線程

Parallel Scavenge收集器

      多線程同時GC。這款收集器的目的是更高的吞吐量。是吞吐量優先收集器,高吞吐量會使得GC停頓時間變長。但整體的用戶運行代碼時間變多了。吞吐量:運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間)對象

      該收集器既能夠自動調節也能夠經過手動配置來優化收集過程。blog

Serial Old收集器

      單線程收集器,標記整理算法。是Serial的老年代版本。內存

Parallel Old收集器

      是Parallel Scavenge收集器的老年代版本 標記整理算法。

      解決了只能和Serial Old收集器搭配的尷尬境地。

CMS收集器

      Concurrent Mark Sweep 收集器是以獲取最短回收停頓時間爲目的的收集器。B/S應用關注用戶的體驗,更短的響應時間。CMS這點很適合。

      從名字來看,併發標記清除。是一款能夠和用戶線程併發的收集器。

      分爲四個步驟:初始標記、併發標記、從新標記、併發清除。其中初始標記和從新標記須要stop the world,也就是中止其餘工做線程。

      初始標記步驟標記全部GC Roots直接關聯到的對象,速度很快,併發標記階段就是進行GC Roots Tracing(追蹤)的過程。從新標記是修正併發標記階段用戶線程繼續運行而發生的改變。併發清除就不用說了。

整個過程最耗時的追蹤和清除實現了併發。而標記GC Roots和從新標記耗時很短。

缺點:一、佔用用戶線程的CPU。影響用戶體驗。佔用線程數爲(CPU數量+3)/4,CPU越多佔用的越少。

   二、沒法處理浮動垃圾,因此老年代要預留空間。能夠上調老年代GC閾值來調優,可是過高會形成「Concurrent Mode Failure」失敗。形成啓用備用方案Serial Old來GC老年代,形成長時間停頓。反而下降性能

   三、標記清除會形成老年代空間碎片太多,若是有大對象會引起Full GC。默認是每次Full GC都進行整理,能夠設置次數來優化。(若是程序涉及大對象就多整理,若是不涉及就能夠不多的整理)

G1收集器

特色:

  一、併發與並行

  二、分代收集 (全部收集器都是分代的)

  三、空間整合

  四、可預測的停頓

      Garbage First收集器是整堆收集器。雖然還保留新生代和老年代的概念,可是他們都是一部分Region的集合,而再也不有物理隔離。

相關文章
相關標籤/搜索