首頁  >  文章  >  Java  >  Hotspot--垃圾回收器(JVM)詳細講解

Hotspot--垃圾回收器(JVM)詳細講解

巴扎黑
巴扎黑原創
2017-07-17 11:51:081961瀏覽

  前兩篇《JVM入門-運行時資料區》《JVM常見垃圾回收演算法》所提到的其實JVM規格以及常用的垃圾回收演算法,具體的JVM實作其實不只一種,有JRockitJ9等,當然最著名當屬HotSpot JVM#。以下是HotSpot JVM的整體架構圖,本文著重在HotSpot中的垃圾回收器(Garbage Collector)。

  現有的HotSpot垃圾回收器以及之間的關係和應用範圍如下圖所示:

  其中G1 GC#  其中G1 GC非常顯眼的處於新生代與老年代之間,可以猜測這個G1 GC可同時運用在新生代和老年代,確實可以說G1#是一個劃時代新概念

GC

  在介紹上面的垃圾回收器之前要先說明JVM虛擬機器的Client模式和Server模式,Java所能做的事一是做客戶端簡單說就是GUI#桌面應用程序,二是可以用作伺服器端。兩種模式Client模式啟動快,啟動後效能較差,

Server

模式啟動慢,啟動後效能較高。 Serial GC#-XX##:+UseSerialGC,複製演算法,新生代

  這是一個比較古老的垃圾收集器,我理解它為簡單粗暴,簡單粗暴的方法往往可以處理簡單的環境,事實上Serial GCClient模式下正是如此。它是一個串列的垃圾收集器,串列意味著就算是有多核心處理器也不會有多個執行緒來並行回收,在串列的同時,其它的正常工作執行緒也要停止工作,稱為「Stop the world」。這實際上很好理解,你在清掃垃圾的時候,總不希望有人同時在丟垃圾吧。當然Serial GC在現今的HotSpot JVMServer模式下已經幾乎廢棄。另外,它工作使用垃圾回收的複製演算法工作在##Java

#堆的新生代。   ######

ParNew GC##-#XX:+#Use

##。 ParNewGC複製演算法新代#)   ParNew GC其實是Serial GC的多執行緒版本。上面提到了Serial GC

即使是多核心

CPU的環境下也是單執行緒進行垃圾記憶體的回收。此垃圾收集器側可以做到多線程環境下進行垃圾記憶體的回收,這個多線程也僅僅是垃圾回收的多線程,而不是與用戶線程並發執行。並且只有它能與CMS老年代的垃圾回收器配合使用,而CMS又恰恰是劃時代意義的垃圾回收器,所以當JVM

的老年代垃圾回收器是

CMS的話,新生代的垃圾回收器通常是ParNew GCParallel GC

-XX:+UseParallelGC,複製演算法,新生代)  它有點和ParaNew GC類似,從名字來看也是並行的多執行緒收集器。我們之前提到過,在進行GC的過程中要「Stop the world」

,停頓時間越短當然越好,很多垃圾回收器(包括前兩個)關注的是如何提高停頓時間。而######Parallel GC######關注的則是吞吐量。它關注的是垃圾回收的整體耗時,如果垃圾回收所佔用的整體耗時較短,則吞吐量高,######CPU######就能將越多的時間用於任務的執行上######,###(吞吐量 ###= ######任務運行時間 ######/ ######(任務運行時間 ### ###+ ######垃圾回收時間))###。 ############Serial Old GC###(######-XX:+UseSerialOldGC######,標記######-##### #壓縮演算法,老年代)###############  它是###Serial GC######的老年代版本,同樣也是單線程,也能與## ####Parallel GC######搭配使用作為它的老年代######GC######。 ###############Parallel Old GC###(######-XX######:######+UseParallelOldGC##### #,標記######-######壓縮演算法,老年代)############

  為了避免如果在新生代選擇了Parallel GC#而老年代則只有選擇Serial Old GC#的困境,出現了Parallel GC的舊年代版本——Parallel Old GC。故如果在一些需要高吞吐量的常數利用Parallel GCParallel Old GC組合將會是一個很好的選擇。

☆Concurrent Mark Sweep(CMS) GC #(##-XX:+UseConcMarkSweepGC,標記-清除演算法,老年代)

  CMS GC

幾乎佔據著JVM

  1. #老年代垃圾收集器的半壁江山,它劃時代的意義就是垃圾回收線程幾乎能用戶線程做到同時工作。

  2. 幾乎

  3. 是因為它還是無法做到完全不需要

  4. 「Stop the world」

,只是它盡可能的縮短了停頓時間。 它的整個垃圾回收過程可分為以下4個步驟:##初始標記並發標記重新標記##  這4個步驟初始標記#與

###重新標記######」######需要短暫的######「Stop the world」#######,並發標記的過程實際上就是和使用者執行緒同時工作,也就是######「######一邊丟垃圾,一邊打掃######」######,這樣就會帶來一個問題,如果垃圾的產生是在標記後發生,那麼這次垃圾就只有等到下次再回收。當然等到標記完了過後垃圾自然不會和使用者執行緒產生衝突,而清理過程就能和使用者執行緒同時處理了。對於此垃圾回收器有一個比較顯著且不可避免的一個問題就是它所採用的是######“#############-#####清除# #####」######演算法,也就是說它不同會壓縮存活的對象,這樣就會帶來記憶體空間碎片化的問題,如果出現需要分配一個連續的較大的記憶體空間則只能觸發一次######Full GC######。上一篇《JVM常見垃圾回收演算法》中談到了在新生代的垃圾回收稱為######「Minor GC」######,老年代的垃圾回收稱為###### #「Major GC」######,而######「Full GC」######則是在整個堆上觸發一次垃圾回收,可想而知代價會相當高,而且此時不得不暫停使用者線程,只能針對特定使用場景透過調整######CMS GC######的參數進行調整最佳化。 ###############☆######Garbage-First(G1) GC(-XX:+UseG1GC)##########

  G1 GC較之前所有的垃圾回收器都不同,從開頭的第二幅圖就能看出,它涵蓋了新生代和老年代,或者說僅僅是從邏輯上還保留新生代老年

#################### #”######這種說法,實際上它已不存在記憶體分代,它在######JDK6######中只是實驗版,在###### JDK7u4######過後才正式商用,對於此垃圾回收器我將會單獨對其講解,另外它的論文地址在:######http://citeseerx.ist.psu.edu/ viewdoc/download?doi=10.1.1.63.6386&rep=rep1&type=pdf######。 ##########

以上是Hotspot--垃圾回收器(JVM)詳細講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn