天天看點

jvm系列(九):Java GC 分析

Java GC就是JVM記錄儀,書畫了JVM各個分區的表演。

Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C++/C的主要差別之一,作為Java開發者,一般不需要專門編寫記憶體回收和垃圾清理代碼,對記憶體洩露和溢出的問題,也不需要像C程式員那樣戰戰兢兢。這是因為在Java虛拟機中,存在自動記憶體管理和垃圾清掃機制。概括地說,該機制對JVM(Java Virtual Machine)中的記憶體進行标記,并确定哪些記憶體需要回收,根據一定的回收政策,自動的回收記憶體,永不停息(Nerver Stop)的保證JVM中的記憶體空間,防止出現記憶體洩露和溢出問題。

在Java語言出現之前,就有GC機制的存在,如Lisp語言),Java GC機制已經日臻完善,幾乎可以自動的為我們做絕大多數的事情。然而,如果我們從事較大型的應用軟體開發,曾經出現過記憶體優化的需求,就必定要研究Java GC機制。

一般情況可以通過兩種方式來擷取GC日志,一種是使用指令動态檢視,一種是在容器中設定相關參數列印GC日志。

Java 自動的工具行指令,jstat可以用來動态監控JVM記憶體的使用,統計垃圾回收的各項資訊。

比如常用指令,<code>jstat -gc</code> 統計垃圾回收堆的行為

也可以設定間隔固定時間來列印:

這個指令意思就是每隔2000ms輸出1262的gc情況,一共輸出20次

JVM的GC日志的主要參數包括如下幾個:

<code>-XX:+PrintGC</code> 輸出GC日志

<code>-XX:+PrintGCDetails</code> 輸出GC的詳細日志

<code>-XX:+PrintGCTimeStamps</code> 輸出GC的時間戳(以基準時間的形式)

<code>-XX:+PrintGCDateStamps</code> 輸出GC的時間戳(以日期的形式,如 2017-09-04T21:53:59.234+0800)

<code>-XX:+PrintHeapAtGC</code> 在進行GC的前後列印出堆的資訊

<code>-Xloggc:../logs/gc.log</code> 日志檔案的輸出路徑

在生産環境中,根據需要配置相應的參數來監控JVM運作情況。

我們經常在tomcat的啟動參數中添加JVM相關參數,這裡有一個典型的示例:

根據上面的參數我們來做一下解析:

<code>-Xms2000m -Xmx2000m -Xmn800m -XX:PermSize=64m -XX:MaxPermSize=256m</code>

Xms,即為jvm啟動時得JVM初始堆大小,Xmx為jvm的最大堆大小,xmn為新生代的大小,permsize為永久代的初始大小,MaxPermSize為永久代的最大空間。

<code>-XX:SurvivorRatio=4</code>

SurvivorRatio為新生代空間中的Eden區和救助空間Survivor區的大小比值,預設是8,則兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區占整個年輕代的1/10。調小這個參數将增大survivor區,讓對象盡量在survitor區呆長一點,減少進入年老代的對象。去掉救助空間的想法是讓大部分不能馬上回收的資料盡快進入年老代,加快年老代的回收頻率,減少年老代暴漲的可能性,這個是通過将-XX:SurvivorRatio 設定成比較大的值(比如65536)來做到。

<code>-verbose:gc -Xloggc:$CATALINA_HOME/logs/gc.log</code>

将虛拟機每次垃圾回收的資訊寫到日志檔案中,檔案名由file指定,檔案格式是平檔案,内容和-verbose:gc輸出内容相同。

<code>-Djava.awt.headless=true</code>

Headless模式是系統的一種配置模式。在該模式下,系統缺少了顯示裝置、鍵盤或滑鼠。

<code>-XX:+PrintGCTimeStamps -XX:+PrintGCDetails</code>

設定gc日志的格式

<code>-Dsun.rmi.dgc.server.gcInterval=600000 -Dsun.rmi.dgc.client.gcInterval=600000</code>

指定rmi調用時gc的時間間隔

<code>-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15</code>

采用并發gc方式,經過15次minor gc 後進入年老代

摘錄GC日志一部分

Young GC回收日志:

Full GC回收日志:

通過上面日志分析得出,PSYoungGen、ParOldGen、PSPermGen屬于Parallel收集器。其中PSYoungGen表示gc回收前後年輕代的記憶體變化;ParOldGen表示gc回收前後老年代的記憶體變化;PSPermGen表示gc回收前後永久區的記憶體變化。young gc 主要是針對年輕代進行記憶體回收比較頻繁,耗時短;full gc 會對整個堆記憶體進行回城,耗時長,是以一般盡量減少full gc的次數

通過兩張圖非常明顯看出gc日志構成:

Young GC日志:

jvm系列(九):Java GC 分析

Full GC日志:

jvm系列(九):Java GC 分析

GChisto是一款專業分析gc日志的工具,可以通過gc日志來分析:Minor GC、full gc的時間、頻率等等,通過清單、報表、圖表等不同的形式來反應gc的情況。雖然界面略顯粗糙,但是功能還是不錯的。

配置好本地的jdk環境之後,輕按兩下GChisto.jar,在彈出的輸入框中點選 add 選擇gc.log日志

jvm系列(九):Java GC 分析

GC Pause Stats:可以檢視GC 的次數、GC的時間、GC的開銷、最大GC時間和最小GC時間等,以及相應的柱狀圖

jvm系列(九):Java GC 分析

GC Pause Distribution:檢視GC停頓的詳細分布,x軸表示垃圾收集停頓時間,y軸表示是停頓次數。

GC Timeline:顯示整個時間線上的垃圾收集

jvm系列(九):Java GC 分析

不過這款工具已經不再維護

這是一個web工具,線上使用非常友善.

進入官網,講打包好的zip或者gz為字尾的壓縮包上傳,過一會就會拿到分析結果。

jvm系列(九):Java GC 分析
jvm系列(九):Java GC 分析

推薦使用此工具進行gc分析。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。 

本文如對您有幫助,還請多幫 【推薦】 下此文。 

如果喜歡我的文章,請關注我的公衆号

本文轉自純潔的微笑部落格部落格園部落格,原文連結:http://www.cnblogs.com/ityouknow/p/7550068.html,如需轉載請自行聯系原作者