深入理解Java虛擬機器--垃圾收集及故障診斷
1.垃圾收集演算法
1.1 標記-清除演算法
演算法分為標記和清除兩個階段:首先標記出所有需要回收的物件,在標記完成後統一回收所有被標記的物件,標記過程上一篇部落格說過,
後續的幾種演算法都是基於這個演算法對其不足進行改進.不足的地方只要有兩點:一個是效率問題,標記和清除兩個過程的效率都不高,另外一個不足
是空間問題,標記清除後會產生大量不連續的空間碎片,空間碎片太多可能會導致以後在程式執行過程中需要分配較大物件的時候,無法找到足夠的
連續記憶體而不得不提前觸發另外一次GC.
1.2 複製演算法
複製演算法是為了解決上述的效率問題.它將可用記憶體按容量劃分成大小相等的兩塊,每次只使用其中的一塊.當這塊記憶體,就將還存活的物件複製到
另一塊記憶體上,然後再把已經使用過的記憶體空間一次性清理掉.雖然這種方法比較高效,但是記憶體只利用了一半,代價太高. HotSpot中預設 Eden 和 Survivor
的比例為8:1 即 能使用到90%的記憶體空間(有兩個Survivor)
1.3 標記-整理演算法
主要針對老年代.標記階段和標記-清除演算法一樣,後續階段不是直接清除可回收物件,而是讓所有存活的物件都向一端移動,然後直接清理掉端邊界以外
的記憶體.
2.垃圾收集器
2.1 Serial收集器
單執行緒垃圾收集器,當它進行垃圾收集時,必須暫停其他所有的工作執行緒,直到它收集結束.
2.2 ParNew收集器
ParNew就是Serial的多執行緒版本
2.3 Parallel Scavenge 收集器
Parallel Scavenge 收集器是一個新生代收集器,它也是使用複製演算法的收集器又是多執行緒的收集器,但是它關注的點是達到一個可控制的吞吐量.
停頓時間越短就越適合需要與使用者互動的程式,良好的響應速度能提升使用者體驗,而高吞吐量則可以高效率地利用CPU時間,儘快完成程式的運算任務,主要
適合後臺運算而不需要太多互動的任務.
2.4 Serial Old收集器
Serail Old 是一個老年段收集器,它同樣是單執行緒收集器,使用標記-整理演算法.
2.5 Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多執行緒和標記-整理演算法.
2.6 CMS 收集器
CMS 收集器是一種以獲取最短收回停頓時間為目標的收集器. 使用標記-清除演算法實現,分為4個步驟
初始標記,併發標記,重新標記,併發清除
初始標記和重新標記兩個階段仍然需要 "Stop The World" ,初始標記僅僅只是標記一下 GC Roots 能直接關聯到的物件,速度很快,併發標記階段就是
進行GC Roots Tracing的過程,而重新標記階段是為了修正併發標記期間因為使用者程式繼續執行而導致標記產生變動的那一部分物件的標記紀錄,這個階段的
停頓時間一般會比初試標記階段稍長一些,但遠比並發標記的時間短.併發標記和併發清除過程收集器執行緒可以與使用者執行緒一起工作.
2.7 G1 收集器
G1 收集器分為以下幾個步驟:
初始標記,併發標記,最終標記,帥選回收.
3.故障診斷
3.1 JDK 命令列工具
3.1.1 jps 虛擬機器程序狀態工具
jps [ options] [hostid]
可用 引數 -q -m -l -v
3.1.2 jstat 虛擬機器 統計資訊監控工具
jstat [ option vmid [ interval [s|ms] [count]] }
jstat -gc 2764 250 20
可用引數 -class -gc -gccapacity -gcutil -gccause -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -compiler -printcompiltion
3.1.3 jinfo java 配置資訊工具
jinfo [option] pid
3.1.4 jmap java記憶體映像工具
jmap [ option ] vmid
可用引數-dump -finalizerinfo -heap -histo -permstat -F
3.1.5 jhat 虛擬機器堆轉儲快照分析工具
3.1.6 jstack java堆疊跟蹤工具
jstack [ option] vmid
可用引數 -F -l -m
3.2 JConsole java 監控與管理控制檯
具體使用可以參考博主的另外一篇部落格https://blog.csdn.net/sqh201030412/article/details/82419923
3.3 VisualVM 多合一故障處理工具
目前功能最強大的執行監控和故障處理程式.可以安裝外掛進行擴充套件