天天看點

淺談GC垃圾回收器

淺談GC垃圾回收器

  • java中四種類型的垃圾回收器
  • Java 8 的新特性
  • 與Java垃圾回收有關的JVM關鍵配置
  • 使用JVM GC參數的例子
  • Java垃圾回收器的性能評估工具
  • 小結
  • Refer
一、Java有四種類型的垃圾回收器:

1、串行垃圾回收器(Serial Garbage Collector)

2、并行垃圾回收器(Parallel Garbage Collector)

3、并發标記掃描垃圾回收器(CMS Garbage Collector)

4、G1垃圾回收器(G1 Garbage Collector)

淺談GC垃圾回收器

每種類型都有自己的優勢與劣勢。重要的是,我們程式設計的時候可以通過JVM選擇垃圾回收器類型。我們通過向JVM傳遞參數進行選擇。每種類型在很大程度上有 所不同并且可以為我們提供完全不同的應用程式性能。了解每種類型的垃圾回收器并且根據應用程式選擇進行正确的選擇是非常重要的。

1、串行垃圾回收器

串行垃圾回收器通過持有應用程式所有的線程進行工作。它為單線程環境設計,隻使用一個單獨的線程進行垃圾回收,通過當機所有應用程式線程進行工作,是以可能不适合伺服器環境。它最适合的是簡單的指令行程式。

通過JVM參數-XX:+UseSerialGC可以使用串行垃圾回收器。

2、并行垃圾回收器

并行垃圾回收器也叫做 throughput collector 。它是JVM的預設垃圾回收器。與串行垃圾回收器不同,它使用多線程進行垃圾回收。相似的是,它也會當機所有的應用程式線程當執行垃圾回收的時候

3、并發标記掃描垃圾回收器

并發标記垃圾回收使用多線程掃描堆記憶體,标記需要清理的執行個體并且清理被标記過的執行個體。并發标記垃圾回收器隻會在下面兩種情況持有應用程式所有線程。

1、當标記的引用對象在tenured區域;

2、在進行垃圾回收的時候,堆記憶體的資料被并發的改變。

相比并行垃圾回收器,并發标記掃描垃圾回收器使用更多的CPU來確定程式的吞吐量。如果我們可以為了更好的程式性能配置設定更多的CPU,那麼并發标記上掃描垃圾回收器是更好的選擇相比并發垃圾回收器。

通過JVM參數 XX:+USeParNewGC 打開并發标記掃描垃圾回收器。

4、G1垃圾回收器

G1垃圾回收器适用于堆記憶體很大的情況,他将堆記憶體分割成不同的區域,并且并發的對其進行垃圾回收。G1也可以在回收記憶體之後對剩餘的堆記憶體空間進行壓縮。并發掃描标記垃圾回收器在STW情況下壓縮記憶體。G1垃圾回收會優先選擇第一塊垃圾最多的區域

通過JVM參數 –XX:+UseG1GC 使用G1垃圾回收器

二、Java 8 的新特性

在使用G1垃圾回收器的時候,通過 JVM參數 -XX:+UseStringDeduplication 。 我們可以通過删除重複的字元串,隻保留一個char[]來優化堆記憶體。這個選擇在Java 8 u 20被引入。

我們給出了全部的四種Java垃圾回收器,需要根據應用場景,硬體性能和吞吐量需求來決定使用哪一種。

三、與Java垃圾回收有關的JVM關鍵配置

運作的垃圾回收器類型

配置 描述
-XX:+UseSerialGC 串行垃圾回收器
-XX:+UseParallelGC 并行垃圾回收器
-XX:+UseConcMarkSweepGC 并發标記掃描垃圾回收器
-XX:ParallelCMSThreads= 并發标記掃描垃圾回收器 =為使用的線程數量
-XX:+UseG1GC G1垃圾回收器

GC的優化配置

配置 描述
-Xms 初始化堆記憶體大小
-Xmx 堆記憶體最大值
-Xmn 新生代大小
-XX:PermSize 初始化永久代大小
-XX:MaxPermSize 永久代最大容量
四、使用JVM GC參數的例子
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=m -XX:MaxPermSize=m -XX:+UseSerialGC -jar java-application.jar
           
五、Java垃圾回收器的性能評估工具

–XX:+PrintGCDetails和–XX:+PrintGCTimeStamps

垃圾回收的開始時間,持續時間,每一代的空餘記憶體等資訊。

jmap [options] pid

jamp 2043 檢視2043程序裡面已經加載的共享對象。通常是DLL檔案。

jmap -heap 2043 檢視記憶體堆的配置資訊以及使用情況。

jmap -permstat 2043 檢視永久代的加載情況。

jmap -histo 2043 檢視類的加載和記憶體占用情況。

jstat [options] pid

jstat -class 2043 class加載、解除安裝、記憶體占用情況。

jstat -gc 2043 GC執行情況。

六、小結

1、Java提供自動選擇和自動性能優化功能。

2、在做垃圾回收器調優之前,先列出所關注的性能名額,通過指令行告訴JVM你所關注的性能名額,由JVM自動調優,如果不滿意,可以指定垃圾回收器。

3、OutOfMemory通常是由于堆記憶體不足,調節-Xmx1024m和-XX:MaxPermSize=128m指令行可選項即可。

七、Refer

1、http://javapapers.com/java/types-of-java-garbage-collectors/

2、Java Memory Management Whitepaper