在這篇教程中咱們將學習幾種現有的垃圾回收器。在Java中,垃圾回收是一個自動的進程能夠替代程序員進行內存的分配與回收這些複雜的工做。這篇是垃圾回 收教程系列的第三篇,在前面的第2部分咱們看到了在Java中垃圾回收是如何工做的,那是篇有意思的文章,我推薦你去看一下。第一部分介紹了Java的垃 圾回收,主要有JVM體系結構,堆內存模型和一些Java術語。
Java有四種類型的垃圾回收器:
- 串行垃圾回收器(Serial Garbage Collector)
- 並行垃圾回收器(Parallel Garbage Collector)
- 併發標記掃描垃圾回收器(CMS Garbage Collector)
- G1垃圾回收器(G1 Garbage Collector)
每種類型都有本身的優點與劣勢。重要的是,咱們編程的時候能夠經過JVM選擇垃圾回收器類型。咱們經過向JVM傳遞參數進行選擇。每種類型在很大程度上有 所不一樣而且能夠爲咱們提供徹底不一樣的應用程序性能。理解每種類型的垃圾回收器而且根據應用程序選擇進行正確的選擇是很是重要的。
一、串行垃圾回收器
串行垃圾回收器經過持有應用程序全部的線程進行工做。它爲單線程環境設計,只使用一個單獨的線程進行垃圾回收,經過凍結全部應用程序線程進行工做,因此可能不適合服務器環境。它最適合的是簡單的命令行程序。
經過JVM參數-XX:+UseSerialGC
可使用串行垃圾回收器。
二、並行垃圾回收器
並行垃圾回收器也叫作 throughput collector 。它是JVM的默認垃圾回收器。與串行垃圾回收器不一樣,它使用多線程進行垃圾回收。類似的是,它也會凍結全部的應用程序線程當執行垃圾回收的時候
三、併發標記掃描垃圾回收器
併發標記垃圾回收使用多線程掃描堆內存,標記須要清理的實例而且清理被標記過的實例。併發標記垃圾回收器只會在下面兩種狀況持有應用程序全部線程。
- 當標記的引用對象在tenured區域;
- 在進行垃圾回收的時候,堆內存的數據被併發的改變。
相比並行垃圾回收器,併發標記掃描垃圾回收器使用更多的CPU來確保程序的吞吐量。若是咱們能夠爲了更好的程序性能分配更多的CPU,那麼併發標記上掃描垃圾回收器是更好的選擇相比並發垃圾回收器。
經過JVM參數 XX:+USeParNewGC
打開併發標記掃描垃圾回收器。
四、G1垃圾回收器
G1垃圾回收器適用於堆內存很大的狀況,他將堆內存分割成不一樣的區域,而且併發的對其進行垃圾回收。G1也能夠在回收內存以後對剩餘的堆內存空間進行壓縮。併發掃描標記垃圾回收器在STW狀況下壓縮內存。G1垃圾回收會優先選擇第一塊垃圾最多的區域
經過JVM參數 –XX:+UseG1GC
使用G1垃圾回收器
Java 8 的新特性
在使用G1垃圾回收器的時候,經過 JVM參數 -XX:+UseStringDeduplication
。 咱們能夠經過刪除重複的字符串,只保留一個char[]來優化堆內存。這個選擇在Java 8 u 20被引入。
咱們給出了所有的四種Java垃圾回收器,須要根據應用場景,硬件性能和吞吐量需求來決定使用哪種。
垃圾回收的JVM配置
下面的JVM關鍵配置都與Java垃圾回收有關。
運行的垃圾回收器類型
配置 | 描述 |
---|---|
-XX:+UseSerialGC | 串行垃圾回收器 |
-XX:+UseParallelGC | 並行垃圾回收器 |
-XX:+UseConcMarkSweepGC | 併發標記掃描垃圾回收器 |
-XX:ParallelCMSThreads= | 併發標記掃描垃圾回收器 =爲使用的線程數量 |
-XX:+UseG1GC | G1垃圾回收器 |
GC的優化配置
配置 | 描述 |
---|---|
-Xms | 初始化堆內存大小 |
-Xmx | 堆內存最大值 |
-Xmn | 新生代大小 |
-XX:PermSize | 初始化永久代大小 |
-XX:MaxPermSize | 永久代最大容量 |
使用JVM GC參數的例子
1
|
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar
|
在Java垃圾回收教程的下一部分,咱們將會用一個Java程序演示如何監視和分析垃圾回收。
目錄
在這個Java GC系列教程中,讓咱們學習用於垃圾回收監視和分析的工具。而後,選用一種工具來監視一個Java示例程序的垃圾回收過程。若是你是一名初學者,你最好仔細閱讀該系列教程。你能夠從這裏(垃圾回收介紹)開始。
Java GC監視和分析工具
下面是一些可用的工具,每一個都有本身的優點和缺點。咱們能夠經過選擇正確的工具並分析,來提高應用程序的性能。這篇教程中,咱們選用Java VisualVM。
- Java VisualVM
- Naarad
- GCViewer
- IBM Pattern Modeling and Analysis Tool for Java Garbage Collector
- HPjmeter
- IBM Monitoring and Diagnostic Tools for Java-Garbage Collection and Memory
- Visualizer
- Verbose GC Analyzer
Java VisualVM
Java VisualVM使用是免費的,其須要安裝Java SE SDK。看一下Java JDK的bin文件夾中(路徑:\Java\jdk1.8.0\bin),這裏面有不少javac和java工具,jvisualvm就是其中之一。
Java VisualVM可以被用於:
- 生成並分析堆的內存轉儲;
- 在MBeans上觀察並操做;
- 監視垃圾回收;
- 內存和CPU性能分析;
一、啓動VisualVM
jvisualvm位於JDK bin文件夾下,直接點擊就能夠。
二、安裝可視化GC插件
咱們須要安裝可視化GC插件,以便在Java GC過程當中有良好的視覺感覺。
三、監視GC
如今,是時候監視垃圾回收進程了,開啓你的Java程序,它將自動被檢測到並顯示到Java VisualVM界面,左側「Application」(應用程序)窗口下,「Local」(本地節點)下,全部本地運行的Java程序都會被列出。
Java VisualVM是一個Java應用程序,所以它也會被列在其中,教程的意圖在於使用VisualVM來監視它本身的GC進程。
雙擊「Local」(本地)下的VisualVM圖標。
如今,程序監控窗口在右側打開,這有許多不一樣關於應用程序性能的相關監視指數的tab頁,目前爲止,咱們最感興趣的是「Visual GC」,點擊它。
上面圖片顯示在Old、Eden、S0和S1上空間利用狀況,下圖顯示了每部分空間的分配和釋放狀況。它按照指定的刷新率保持持續刷新。
上面圖片所展現的是正常運行程序的狀況,當出現內存泄露或者反常的行爲時,它會在圖表中明確的顯示出來。最少咱們能理解他是與對象內存分配和垃圾回收相關的事情。隨後,經過其餘tab頁(像「Threads」)和Thread Dump的幫助,咱們可以減小這個問題。
在「Monitor」tab頁中,咱們可以監控並定時展現全部堆內存使用狀況圖。經過「Perform GC」按鈕能夠啓動垃圾回收進程。
在「Sampler」tab頁中,咱們可以啓動內存和CPU性能分析,它將顯示詳細每一個實例使用的實時報告,它將幫助咱們明確性能問題。
這篇教程是咱們四篇Java垃圾回收系列教程的最後一篇。