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

2020-09-05 架構師速成記

一、前言

本小節會介紹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目錄找到以下圖標,雙擊打

然後你會看到

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

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

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

線程標籤頁如下:

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

3.2 JConsole介紹

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

在JDK安裝目錄找到jconsole.exe

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

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

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

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

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

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

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

3.3 性能採集工具

1)linux命令工具

top命令:

top命令參數

-h | -v: 顯示幫助或者版本信息】** -c:** 命令行列顯示程序名以及參數-d: 啟動時設置刷新時間間隔-H: 設置線程模式-i: 只顯示活躍進程-n: 顯示指定數量的進程-p: 顯示指定PID的進程-u: 顯示指定用戶的進程

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

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

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

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

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)

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位機器上,需要指定選項&34;,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調優方法。

相關焦點

  • Java面試總結之JVM
    二、類的加載機制類的加載過程是指將java編譯之後的class文件讀入到內存中,然後在堆區創建一個java.lang.Class對象,用於封裝類在方法區內的數據結構。類加載的最終目的是封裝類在方法區的數據結構,並向java程式設計師提供訪問方法區數據的接口。
  • 阿里爆款Java性能優化神仙筆記!調優不止JVM
    通常來說Java性能優化一般包含這五方面:設計優化代碼優化JVM優化資料庫優化作業系統優化可以說性能調優在很大程度上是一門藝術,解決的Java性能問題越多,技藝才會越精湛。本文網際網路雷鋒(小編我)要為大家介紹的Alibaba內部性能優化進階筆記就不僅僅只針對JVM調優進行講解,每一章節都有實際的案例支撐。具體包括:性能優化策略.程序編寫及硬體伺服器的基礎知識、Java API優化建議、算法類程序的優化建議、並行計算優化建議、Java程序性能監控及檢測、JVM原理知識等。
  • Java性能優化之前奏篇(一)
    前言乾貨君接下來一段時間,準備從系統的各個角度和層次來對系統進行性能優化的講解和心得分享,歡迎大家關注我,以獲取系統的優化方法。正文一套完整優化體系,可以從以下幾個方面:1 設計優化:一個良好的系統設計,可以規避很多潛在的性能問題,因此,在軟體架構設計層面,儘可能的多考慮軟體系統未來的性能要求,並為此提前應用關鍵設計,減少後期不必要的架構優化。
  • 三大步驟,一周啃透了JVM,順利拿下字節跳動研發崗Offer
    JVM覆蓋的內容確實是太多了,包括:JVM內存管理機制解讀如何快速分配和定位Java對象GC算法與GC底層原理JVM內部組成及揭秘其執行過程億級流量高並發下GC預估與調優JVM調優工具及GC分析第5章 垃圾收集器和內存分配…第6章 性能監控工具
  • 三大步驟,一周啃透了JVM,淡定拿下字節跳動研發崗Offer
    JVM覆蓋的內容確實是太多了,包括:JVM內存管理機制解讀如何快速分配和定位Java對象GC算法與GC底層原理JVM內部組成及揭秘其執行過程億級流量高並發下GC預估與調優JVM調優工具及GC分析現在各大平臺上關於jvm的文章有很多,不過寫的有些偏基礎
  • Java性能調優:利用VisualVM進行性能分析
    ,內存情況,查看方法的CPU時間和內存中的對 象,已被GC的對象,反向查看分配的堆棧(如100個String對象分別由哪幾個對象分配出來的)。雙擊啟動 jvisualvm.exe,啟動起來後和jconsole 一樣同樣可以選擇本地和遠程,如果需要監控遠程同樣需要配置相關參數。
  • 阿里P8專家用5個小時讓你精通JVM調優,共計3.7G
    前言做java開發的幾乎都知道jvm這個名詞,但是由於jvm對實際的簡單開發的來說關聯的還是不多,一般工作個一兩年(當然不包括愛學習的及專門做性能優化的什麼的),很少有人能很好地去學習及理解什麼是jvm,以及弄清楚jvm
  • 阿里P8專家用5個小時讓你精通JVM調優,共計3.7G
    前言做java開發的幾乎都知道jvm這個名詞,但是由於jvm對實際的簡單開發的來說關聯的還是不多,一般工作個一兩年(當然不包括愛學習的及專門做性能優化的什麼的),很少有人能很好地去學習及理解什麼是jvm,以及弄清楚jvm的工作原理,個人認為這塊還是非常有必要去認真了解及學習的,特別是剛入門或入門不久的java開發來說,這是java
  • JAVA HEAP SPACE解決方法和JVM參數設置
    可以查看到被監控的jvm的內存信息,線程信息,類加載信息,MBean信息。 jconsole位於jdk目錄下的bin目錄,在windows下是jconsole.exe,在unix和linux下是 jconsole.sh,jconsole可以監控本地應用,也可以監控遠程應用。
  • 8款JVM性能調優監控工具(提高開發效率)
    首先我們先對幾種要講的工具進行一個概述,然後再分別分析:一、性能監控工具概述工具主要是為了解決問題而生的,就是由於我們的程序存在著一些性能問題,才有了這些工具。其實當我們在下載完成JDK之後,那些工具就被SUN公司隨之送給我們了。我們可以在我們的JDK安裝目錄,下看看會有很多這樣的工具。
  • 「Java面試題第一期」有沒有jvm調優經驗?調優方案有哪些?
    調優時機:a. heap 內存(老年代)持續上漲達到設置的最大內存值;b. Full GC 次數頻繁;c. GC 停頓時間過長(超過1秒);d. 應用出現OutOfMemory 等內存異常;e. 應用中有使用本地緩存且佔用大量內存空間;f. 系統吞吐量與響應性能不高或下降。2.
  • 常見的jvm調優策略
    一般來說,jvm的調優策略是沒有一種固定的方法,只有依靠我們的知識和經驗來對項目中出現的問題進行分析,正如吉德林法則那樣當你已經把問題清楚寫出來,就已經解決了一半。雖然JVM調優中沒有固定的策略,但是本文會介紹幾種比較常見的調優策略。
  • Java性能調優實戰(二) | 如何制定性能調優策略
    測試 - 分析 - 調優性能測試攻略性能測試是提前能發現性能瓶頸,保障系統性能穩定的必要措施。1.微基準性能測試微基準性能測試可以精確定位到某個模塊或者某個方法的性能問題,特別適合做一個功能模塊或者一個方法在不同實現方式下的性能對比。例如,對比一個方法使用同步實現和非同步實現的性能。
  • 深入Java調優,不看千萬別後悔
    之前分享了一份JVM 46頁的乾貨資料,關注微信公眾號:Java技術棧,在後臺回覆:jvm46,即可領取。圍繞 Java 性能優化,有兩種最基本的分析方法:現場分析法和事後分析法。現場分析法通過保留現場,再採用診斷工具分析定位。現場分析對線上影響較大,部分場景(特別是涉及到用戶關鍵的在線業務時)不太合適。
  • LoadRunner性能測試系統學習教程:JVM調優(8)
    上期我們講到LoadRunner性能測APR配置,這期我們講LoadRunner性能測試JVM調優。那麼所以運行的代碼其實是在JVM中,即代碼不是直接運行在我們操作平臺,所以JVM調優核心是如何讓JAVA原始碼在JVM中運行的效率更高。影響JVM運行的效率核心指標是內存的使用,所以我們通常說的JVM調優都是在談論內存分配的問題。
  • 深入淺出JVM性能調優——JVM內存模型和類加載運行機制
    :jvm 使用類加載器來加載一個類,這個類加載器是和這個類型綁定的,因此會在類型信息中存儲這個類加載器的引用6)指向 Class 類的引用:每 一個被加載的類型,jvm 都會在堆中創建一個 java.lang.Class 的實例,類型信息中會存儲 Class 實例的引用
  • Github上都在瘋找的京東內部「JVM調優筆記」終於來了
    性能調優在很大程度上是一門藝術。解決的 GC 性能問題越多,技藝才會越精湛。我們不只要關心 GC 的持續演進,也要積極地去了解它的設計原理和設計目標。針對Java程序的性能優化一定不可能避免針對JVM的調優,隨著JVM的不斷發展,我們的應對措施也在不斷地跟隨、變化,內存的使用逐漸變得越來越複雜。所有高級語言都需要垃圾回收機制的保護,所以GC就是這麼重要。
  • 面試必問的JVM性能調優,助你吊打一切敢於提問JVM的面試官
    之前咱們整理過JVM相應基礎知識點,包括內存架構、類加載系統和JVM高頻面試題,對於JVM調優也有介紹,有興趣的同學可以參考下方閱讀推薦。推薦閱讀1:推薦閱讀2:推薦閱讀3:今天,小編就為大家系統講解一下JVM性能調優,深入JVM的內核開發!!!
  • Java後端成神之路
    1, java語言java基礎是十分重要的,java需要掌握的知識包括:內存模型; d,GC垃圾回收; e,jvm性能監控與故障定位; f,jvm調優(3)並發多線程 (1)單例 (2)工廠 (3)代理 (4)策略 (5)模板方法
  • LoaRunner性能測試系統學習教程:SQL監控與調優
    上期我們講到LoadRunner性能測垃圾回收器,這期我們講LoadRunner性能測試SQL監控與調優。MS SQL資料庫監控與調優其實在進行性能測試過程中,我們選擇的業務都與資料庫有關,即選擇的業務都會經過資料庫的處理,那麼業務的響應時間就包含資料庫查詢的時間,同樣如果資料庫查詢的時間過長,那麼將直接導致事務的響應時間過長,所以資料庫的調優也是性能調優的重要組成部分。