您好,登錄后才能下訂單哦!
這篇文章主要介紹了JVM常見垃圾收集器有哪些的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇JVM常見垃圾收集器有哪些文章都會有所收獲,下面我們一起來看看吧。
垃圾收集器 是 垃圾收集算法 的具體實現
現在主流的垃圾收集器有 7 種:
我們會根據需求場景的不同,選擇不同特點的垃圾收集器
下面我會詳細介紹。
最基本、發展歷史最長的垃圾收集器
并發收集 在進行垃圾收集時,必須暫停其他所有工作線程(Stop The World
),直到收集結束。
暫停工作線程 是在用戶不可見的情況下進行
注:并發 與 并行的區別 a. 并發:在 某一時段內,交替執行多個任務(即先處理A再處理B,循環該過程) b. 并行:在 某一時刻內,同時執行多個任務(即同時處理A、B)
單線程 只使用 一條線程 完成垃圾收集(GC
線程)
效率高 對于限定單CPU
環境來說,Serial
收集器沒有線程交互開銷(專一做垃圾收集),擁有更高的單線程收集效率。
垃圾收集高效,即其他工作線程停頓時間短(可控制在100ms內),只要垃圾收集發生的頻率不高,完全可以接受。
復制 算法
客戶端模式下,虛擬機的 新生代區域
Serial
收集器 應用在老年代區域 的版本
并發、單線程、效率高
同Serial
收集器,此處不作過多描述
標記-整理 算法
在客戶端模式下,虛擬機的老年代區域
在服務器模式下:
與 Parallel Scavenge
收集器搭配使用
作為CMS
收集器的后備預案,在并發收集發生Concurrent Mode Failure
時使用
Serial
收集器 的 多線程 版本。
并發收集 在進行垃圾收集時,必須暫停其他所有工作線程(Stop The World
),直到收集結束。
暫停工作線程 是在用戶不可見的情況下進行
多線程收集 使用 多條垃圾收集線程(GC
線程) 完成垃圾收集
由于存在線程交互的開銷,所以在單CPU
環境下,性能差于 Serial
收集器
與CMS
收集器配合工作 目前,只有ParNew
收集器能與 CMS
收集器 配合工作
由于CMS
收集器使用廣泛,所以該特點非常重要。
關于CMS
收集器 下面會詳細說明
復制 算法
服務器模式下,虛擬機的 新生代區域
多線程收集
ParNew
收集器的升級版
具備ParNew 收集器并發、多線程收集的特點
以達到 可控制吞吐量 為目標 其他收集器的目標是: 盡可能縮短 垃圾收集時間,而Parallel Scavenge
收集器的目標則是:達到 可控制吞吐量
吞吐量:CPU
用于運行用戶代碼的時間 與 CPU
總消耗時間(運行用戶代碼時間+垃圾收集時間)的比值
如:虛擬機總共運行100分鐘,其中垃圾收集時間=1分鐘、運行用戶代碼時間 = 99分鐘,那吞吐量 = 99 / 100 = 99%
自適應 該垃圾收集器能根據當前系統運行情況,動態調整自身參數,從而達到最大吞吐量的目標。
該特性稱為:GC
自適應的調節策略
這是Parallel Scavenge
收集器與 ParNew
收集器 最大的區別
復制 算法
服務器模式下,虛擬機的 新生代區域
Parallel Scavenge
收集器 應用在老年代區域 的版本
以達到 可控制吞吐量 為目標、自適應調節、多線程收集
同Parallel Scavenge
收集器
標記-整理 算法
服務器模式下,虛擬機的 老年代區域
即Concurrent Mark Sweep
,基于 標記-清除算法的收集器
并行 用戶線程 & 垃圾收集線程同時進行。
即在進行垃圾收集時,用戶還能工作。
單線程收集 只使用 一條線程 完成垃圾收集(GC線程)
垃圾收集停頓時間短 該收集器的目標是: 獲取最短回收停頓時間 ,即希望 系統停頓的時間 最短,提高響應速度
總吞吐量會降低 因為該收集器對CPU
資源非常敏感,在并發階段,雖不會導致用戶線程停頓,但會因為占用部分線程(CPU
資源)而導致應用程序變慢,總吞吐量會降低
無法處理浮動垃圾 由于 并發清理時 用戶線程還在運行,所以會有新的垃圾不斷產生(即浮動垃圾),只能等到留待下一次GC時再清理掉。
因為這一部分垃圾出現在標記過程之后,所以CMS
無法在當次GC
中處理掉它們
因此,CMS
無法等到老年代被填滿再進行Full GC,CMS需要預留一部分空間。即所謂的:可能出現Concurrent Mode Failure
失敗而導致另一次Full GC
產生。
垃圾收集后會產生大量內存空間碎片 因為 CMS
收集器是基于“標記-清除”算法的。
標記-清除 算法
重視應用的響應速度、希望系統停頓時間最短的場景
如互聯網移動端應用
CMS
收集器 是基于 標記-清除算法實現的收集器,工作流程較為復雜:(分為四個步驟)
初始標記
并發標記
重新標記
并發清除
下面用一張圖詳細說明工作流程:
由于整個過程中,耗時最長的并發標記 和 并發清除過程都可與用戶線程一起進行
所以,CMS
收集器的垃圾收集過程可看作是與用戶線程 并發執行的。
最新、技術最前沿的垃圾收集器
并行 用戶線程 & 垃圾收集線程同時進行。
即在進行垃圾收集時,用戶還能工作
多線程 即使用 多條垃圾收集線程(GC
線程) 進行垃圾收集
并發 & 并行 充分利用多CPU
、多核環境下的硬件優勢 來縮短 垃圾收集的停頓時間
垃圾回收效率高 G1
收集器是 針對性 對 Java
堆內存區域進行垃圾收集,而非每次都對整個 Java
堆內存區域進行垃圾收集。
即 G1
收集器除了將 Java
堆內存區域分為新生代 & 老年代之外,還會細分為許多個大小相等的獨立區域( Region
),然后G1收集器會跟蹤每個 Region
里的垃圾價值大小,并在后臺維護一個列表;每次回收時,會根據允許的垃圾收集時間 優先回收價值最大的Region
,從而避免了對整個Java堆內存區域進行垃圾收集,從而提高效率。
因為上述機制,G1
收集器還能建立可預測的停頓時間模型:即讓 使用者 明確指定一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間不得從超出N毫秒。即具備實時性
分代收集 同時應用在 內存區域的新生代 & 老年代
不會產生內存空間碎片
從整體上看,G1
收集器是基于 標記-整理算法實現的收集器
從局部上看,是基于 復制算法 實現 上述兩種算法意味著 G1
收集器不會產生內存空間碎片。
對于新生代:復制算法
對于老年代:標記 - 整理算法
服務器端虛擬機的內存區域(包括 新生代 & 老年代)
G1
收集器的工作流程分為4個步驟:
初始標記
并發標記
最終標記
篩選回收
下面用一張圖詳細說明工作流程
本文對垃圾收集器的類型進行全面講解
關于“JVM常見垃圾收集器有哪些”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“JVM常見垃圾收集器有哪些”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。