Java性能調優:JVM性能監控常用方法

一、前言

本小節會介紹JVM性能監控,掌握幾種常用的監控工具輔助我們更好的瞭解JVM的性能狀態。生產環境中監控JVM性能,分析監控數據,可以知道何時需要JVM調優,可見監控是非常重要的。

JVM的監控範圍包括垃圾收集、JIT編譯以及類加載。那其中具體都包含哪些?如何監控呢?我們開始探索下吧

二、垃圾收集

監控JVM的垃圾收集非常的重要,因為它對應用的吞吐量和延遲有著深刻的影響。

重要的垃圾收集數據包括:

當前使用的垃圾收集器

Java堆的大小

新生代和老年代的大小

永久代的大小

Minor GC的持續時間

Minor GC的頻率

Minor GC的空間回收量

Full GC的持續時間

Full GC的頻率

每個併發垃圾收集週期的空間回收量

是否老年代或者永久代的佔用觸發了Full GC

應用是否顯式調用了System.gc()

三、圖形/命令工具

除了用命令行選項生成垃圾收集統計數據,我們還可以用圖形化工具監控垃圾收集,用這類工具識別變化趨勢或者模式要比文本容易很多。下列圖形化工具可用於監控HotSpot VM:JConsole、JProfile(收費)、VisualGC(插件)以及VisualVM

3.1 VisualVM介紹

在進行多線程編程以及線程池編程時候,是無法用肉眼確認程序性能的,也不會知道當前jvm上面有多少個線程,線程池用的對不對。這時候就要用 visual vm 這些jdk自帶的性能監測工具了。

簡單介紹:

請打開你的jdk的bin目錄找到以下圖標,雙擊打

Java性能調優:JVM性能監控常用方法

然後你會看到

Java性能調優:JVM性能監控常用方法

點擊左側是用到jvm的程序intellij platform–就是用這的idea java編輯器:

Java性能調優:JVM性能監控常用方法

總共有四個標籤,重點介紹以下“監視”以及“線程”

Java性能調優:JVM性能監控常用方法

監視裡面的線程一欄看看,活動是指目前活動活躍的線程數量,已經啟動的總數是指,程序運行以來一共創建或啟動的線程數量,無論線程狀態是不是完成了,或者已經被銷燬了,還是說正在活動中,抑或在阻塞,全部都統計在這個數字中

線程標籤頁如下:

Java性能調優:JVM性能監控常用方法

線程標籤頁可以選擇所有線程列表,活動的線程或者是已經完成的線程,這些信息也對於判斷程序的性能很重要

3.2 JConsole介紹

JConsole主要用來分析內存,cpu,線程,類等

在JDK安裝目錄找到jconsole.exe

Java性能調優:JVM性能監控常用方法

Java性能調優:JVM性能監控常用方法

概覽:在連接上Java應用程序後,遍可以查看應用程序概況,如下圖所示。圖中4張折線分別顯示了堆內存的使用情況、系統線程數量、加載類的數量以及CPU的使用率。

Java性能調優:JVM性能監控常用方法

內存監控:切換到內存監控頁面,JConsole可以顯示當前內存的詳細細心。這不僅包括堆內存的整體信息,更細化到eden區,survivior區、老年代的使用情況。同時,也包括非堆區,即永久代的使用情況。單機界面右上角“執行GC”按鈕,可以強制應用程序進行一次Full GC。

Java性能調優:JVM性能監控常用方法

線程監控:JConsole中的線程選項卡允許開發人員監控程序內的線程,如下圖所示。JConsole顯示了系統內的線程數量以及程序中所有的線程。單機線程名稱,便可以查看線程的棧信息。

使用“檢測到死鎖”按鈕,還可以自動檢測多線程應用程序的死鎖情況(可快速定位死鎖問題)

Java性能調優:JVM性能監控常用方法

類加載情況:JConsole的類頁面顯示了系統已經裝載的類數量。在詳細信息欄中,還顯示了已經卸載的類數量。

Java性能調優:JVM性能監控常用方法

虛擬機信息:在VM摘要頁面,JConsole顯示了當前應用程序的運行環境。包括虛擬機類型、版本、堆信息以及虛擬機參數等

Java性能調優:JVM性能監控常用方法

MBean管理:MBean頁面允許JConsole進行MBean的管理,包括查看或者設置MBean的屬性、運行MBean的方法等。

Java性能調優:JVM性能監控常用方法

3.3 性能採集工具

1)linux命令工具

top命令:

top命令參數

-h | -v: 顯示幫助或者版本信息】** -c:** 命令行列顯示程序名以及參數

-d: 啟動時設置刷新時間間隔-H: 設置線程模式-i: 只顯示活躍進程-n: 顯示指定數量的進程-p: 顯示指定PID的進程-u: 顯示指定用戶的進程

top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源佔用狀況。top命令的部分輸出如下:

Java性能調優:JVM性能監控常用方法

top視圖分為兩部分:操作系統資源概況信息和進程信息。首先分析資源概況中各個參數的含義,再來分析下進程信息中各個參數含義。

資源概況:

操作系統時間、登錄用戶、負載情況-top00:36:13: 操作系統當前時間up xx days, HH:MM: 操作系統從開機以後運行的時間,運行多少天多少時多少分users: 當前系統有1個用戶登錄在線**load average:**系統平均負載運行的任務概覽-Taskstotal: 系統當前的進程數running: 當前正在運行的進程數sleeping 當前睡眠中的進程數CPU概覽: %Cpu(s) 表示CPU使用百分比,按照時間佔用計算,單位sus: 用戶空間佔用CPU時間百分比,如果是多核,這個數值表示佔用的平均百分比,可以按1進行多核統計和平均統計切換sy: 內核空間佔用CPU時間百分比,如果是多核,同上

ni 用戶進程空間內改變過優先級的進程佔用CPU時間百分比id: 空閒時間佔用CPU百分比wa: 等待輸入輸出的CPU時間百分比hi: CPU服務於硬件中斷的CPU時間百分比si: CPU服務於軟件中斷的CPU時間百分比
注:時間佔用百分比=該種類型操作消耗CPU時間/top刷新間隔時間。top 3s刷新一次,用戶空間進程在這3s內使用了CPU 1.5s,那麼us等於50%=1.5s/3s內存概覽:單位KiBtotal: 內存總量free: 剩餘的內存數量used: 內存使用數量buff/cache: 用於緩衝的內存數量交換區概覽:單位KiBtotal: 交換區總量free: 空閒的交換區數量used: 使用的交換區數量

進程概況

進程概況的統計從多維度參數進行展示的,其中最重要的參數:

PID 進程ID,唯一標識USER 進程所屬用戶%CPU 自上一次top刷新該進程佔用CPU的時間百分比%MEM 進程消耗內存百分比TIME+ 自進程開始以來,消耗CPU時間,單位1/100秒

當服務器中某個JAVA服務進程內存或者CPU資源消耗非常嚴重時,可以使用:top -H -p pid 查看其所有活躍的線程資源消耗情況

sar命令:sar(System Activity Reporter系統活動情況報告)是目前 Linux 上最為全面的系統性能分析工具之一,可以從多方面對系統的活動進行報告,包括:文件的讀寫情況、系統調用的使用情況、磁盤I/O、CPU效率、內存使用狀況、進程活動及IPC有關的活動等。

常用格式sar [options] [-A] [-o file] t [n]

例如,每10秒採樣一次,連續採樣3次,觀察CPU 的使用情況,並將採樣結果以二進制形式存入當前目錄下的文件test中,需鍵入如下命令:

sar -u -o test 10 3

Java性能調優:JVM性能監控常用方法

vmstat命令:是最常見的Linux/Unix監控工具,可以展現給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,內存使用,虛擬內存交換情況,IO讀寫情況。相比top,我可以看到整個機器的CPU,內存,IO的使用情況,而不是單單看到各個進程的CPU使用率和內存使用率(使用場景不一樣)。

一般vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是採樣的時間間隔數,單位是秒,第二個參數是採樣的次數,如:

Java性能調優:JVM性能監控常用方法

iostat命令:iostat主要用於監控系統設備的IO負載情況,iostat首次運行時顯示自系統啟動開始的各項統計信息,之後運行iostat將顯示自上次運行該命令以後的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。

舉例: iostat -d -k 2

參數 -d 表示,顯示設備(磁盤)使用狀態;-k某些使用block為單位的列強制使用Kilobytes為單位;2表示,數據顯示每隔2秒刷新一次。

pidstat命令:pidstat是sysstat工具的一個命令,用於監控全部或指定進程的cpu、內存、線程、設備IO等系統資源的佔用情況。pidstat首次運行時顯示自系統啟動開始的各項統計信息,之後運行pidstat將顯示自上次運行該命令以後的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。

如:查看所有進程的 CPU 使用情況( -u -p ALL)

Java性能調優:JVM性能監控常用方法

2)Windows工具

任務管理器:Windows系統的任務管理器是大家最為熟知的一款系統工具,通過Ctrl+Alt+Del組合鍵便能呼出,功能非常強大的一款新能統計工具。

perfmon性能監控工具:與任務管理器相比,可以說是windows下專業級的性能監控工具了,不僅可以監控計算機系統的整體運行情況,也可以專門針對某一個進程或者線程進行狀態監控。

可以在Windows任務欄的開始菜單的“運行”對話框使用perfmon命令打開該工具。

3)JDK命令行工具

在JDK的開發包中有一系列的輔助工具,可以幫助開發人員很好地解決Java應用的一些疑難雜症。這些工具在JDK安裝目錄的bin目錄中。有哪些命令可以輔助呢?如下所示:

jps命令:jps是用於查看有權訪問的hotspot虛擬機的進程. 當未指定hostid時,默認查看本機jvm進程,否者查看指定的hostid機器上的jvm進程,此時hostid所指機器必須開啟jstatd服務。 jps可以列出jvm進程lvmid,主類類名,main函數參數, jvm參數,jar名稱等信息

命令用法: jps [options] [hostid]

options:命令選項,用來對輸出格式進行控制

hostid:指定特定主機,可以是ip地址和域名, 也可以指定具體協議,端口。

jstat命令:jstat是一個可以用於觀察Java應用程序運行時信息的工具。它的功能非常強大,可以通過它,查看堆信息的詳細情況

jinfo命令:jinfo是jdk自帶的命令,可以用來查看正在運行的Java應用程序的擴展參數,甚至支持在運行時,修改部分參數。通常會先使用jps查看java進程的id,然後使用jinfo查看指定pid的jvm信息.

jmap命令:Jmap是一個可以輸出所有內存中對象的工具,甚至可以將VM 中的heap,以二進制輸出成文本。打印出某個java進程(使用pid)內存內的,所有‘對象’的情況( 如:產生那些對象,及其數量)。

jhat命令:jhat也是jdk內置的工具之一。主要是用來分析java堆的命令,可以將堆中的對象以html的形式顯示出來,包括對象的數量,大小等等,並支持

對象查詢語言

jstack命令:jstack用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息,如果是在64位機器上,需要指定選項"-J-d64",Windows的jstack使用方式只支持以下的這種方式:jstack [-l] pid

如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕鬆地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。**jstatd命令:**此命令是一個RMI Server應用程序,提供了對JVM的創建和結束監視,也為遠程監視工具提供了一個可以attach的接口

hprof工具:HProf是JDK自帶一個簡單的性能分析工具。它是一個動態鏈接庫文件,監控CPU的1使用率、內存堆棧分配情況等

命令的詳細使用方法可搜索相關資料,此處不再展開講解

四、小結

本小節主要介紹了常用的性能採集工具和故障排查工具。基於linux系統和Windows系統的性能採集工具,使用這些工具,有助於幫助開發者定位性能瓶頸。JDK自帶的一些性能和故障排查相關命令,如jps、jstack、jmap等,以及免費的可視化工具JConsole、Visual VM。下一小節我們會介紹JVM調優方法。


分享到:


相關文章: