Java:故障排查、JVM性能監控工具單

2021-02-28 程式設計師技術客棧
當給一個系統定位問題的時候,知識、經驗是關鍵基礎,數據是依據,工具是運用知識處理數據的手段。今天來複習一下Java常用的調試排錯工具單。異常堆棧、JVM運行日誌、垃圾回收日誌、線程快照、堆快照等。使用分析工具能提升咱們分析數據以及定位並解決問題的效率。

常用命令

JDK提供了一系列的用於監控、診斷Java進程的工具,它們在JDK安裝目錄``bin``目錄下,我們該如何使用它去得到有用的信息並分析系統問題以及性能瓶頸呢?下面詳細介紹。

1、jps:JVM進程狀態工具

在linux下我們肯定使用過``ps -ef | grep java``命令查看過正在運行的Java進程,而在java中也提供了類似的命令,此命令可以列出正在運行的虛擬機進程,並顯示虛擬機執行主類名稱以及進程的唯一ID。
usage: jps [-help]       jps [-q] [-mlvV] [<hostid>]Definitions:    <hostid>:      <hostname>[:<port>]

執行案例:

jps -l1228 sun.tools.jps.Jps

option參數說明:

-m:輸出啟動時傳遞給主類main()方法的參數。-l:輸出全類名,如果執行的是JAR包,會輸出JAR包路徑。


2、jstat:JVM統計信息監視工具

此命令可以查看JVM運行狀態。可以顯示本地或者遠程JVM進程中的類加載、內存、垃圾收集、即時編譯等運行時數據。

jstat幫助文檔:

invalid argument countUsage: jstat -help|-options       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]Definitions:  <option>      An option reported by the -options option  <vmid>        Virtual Machine Identifier. A vmid takes the following form:                     <lvmid>[@<hostname>[:<port>]]                Where <lvmid> is the local vm identifier for the target                Java virtual machine, typically a process id; <hostname> is                the name of the host running the target Java virtual machine;                and <port> is the port number for the rmiregistry on the                target host. See the jvmstat documentation for a more complete                description of the Virtual Machine Identifier.  <lines>       Number of samples between header lines.  <interval>    Sampling interval. The following forms are allowed:                    <n>["ms"|"s"]                Where <n> is an integer and the suffix specifies the units as                 milliseconds("ms") or seconds("s"). The default units are "ms".  <count>       Number of samples to take before terminating.  -J<flag>      Pass <flag> directly to the runtime system.

執行案例:

//查看垃圾收集等信息jstat -gc 1441 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   10752.0 10752.0  0.0    0.0   65536.0   9175.5   175104.0     0.0     4480.0 780.7  384.0   76.6       0    0.000   0      0.000    0.000

option參數說明:

-class:監視類加載、卸載數量、總空間以及類裝載的耗時。-compiler:即時編譯器編譯過的方法、耗時等信息。-gc:監視Java堆狀態,包括Eden區、兩個Survivor區、老年代、永久代的容量、已用空間、垃圾收集時間合計等信息。-gccapacity:內容與gc基本類似,但輸出的主要是關注Java堆各個區域使用的最大、最小空間。-gccause:與gcutil功能一樣,但是會額外輸出上一次導致垃圾收集產生的原因。-gcmetacapacity:JDK8下元數據空間統計。-gcnewcapacity:與gcnew類似,輸出使用到的最大、最小空間。-gcoldcapacity:與gcold類似,輸出使用到的最大、最小空間。-gcutil:監視內容與gc類似,輸出已使用空間佔總空間的百分比。-printcompilation:輸出已經被即時編譯的方法。

3、jinfo:Java配置信息工具

可以用來查看正在運行的Java程序的擴展參數,包括Java system屬性和JVM命令行參數;也可以動態修改正在運行的JVM參數。

jinfo幫助文檔:

Usage:    jinfo [option] <pid>        (to connect to running process)    jinfo [option] <executable <core>        (to connect to a core file)    jinfo [option] [server_id@]<remote server IP or hostname>        (to connect to remote debug server)where <option> is one of:    -flag <name>         to print the value of the named VM flag    -flag [+|-]<name>    to enable or disable the named VM flag    -flag <name>=<value> to set the named VM flag to the given value    -flags               to print VM flags    -sysprops            to print Java system properties    <no option>          to print both of the above    -h | -help           to print this help message

執行案例:

jinfo -flags 18378Attaching to process ID 18378, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.261-b12Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=262144000 -XX:MaxHeapSize=4164943872 -XX:MaxNewSize=1388314624 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=87031808 -XX:OldSize=175112192 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC

option參數說明:

-flag [+|-]name 開啟或者關閉對應名稱的參數。-flag name=value 設定對應名稱的參數。

4、jmap:Java內存映像工具

jamp命令用於生成堆轉儲快照。還可以查詢finalize執行隊列、Java堆和方法區的詳細信息,例如空間使用率、當前使用的是哪一種收集器等。

jmap幫助文檔:

Usage:    jmap [option] <pid>        (to connect to running process)    jmap [option] <executable <core>        (to connect to a core file)    jmap [option] [server_id@]<remote server IP or hostname>        (to connect to remote debug server)where <option> is one of:    <none>               to print same info as Solaris pmap    -heap                to print java heap summary    -histo[:live]        to print histogram of java object heap; if the "live"                         suboption is specified, only count live objects    -clstats             to print class loader statistics    -finalizerinfo       to print information on objects awaiting finalization    -dump:<dump-options> to dump java heap in hprof binary format                         dump-options:                           live         dump only live objects; if not specified,                                        all objects in the heap are dumped.                           format=b     binary format                           file=<file>  dump heap to <file>                         Example: jmap -dump:live,format=b,file=heap.bin <pid>    -F                   force. Use with -dump:<dump-options> <pid> or -histo                         to force a heap dump or histogram when <pid> does not                         respond. The "live" suboption is not supported                         in this mode.    -h | -help           to print this help message    -J<flag>             to pass <flag> directly to the runtime system

執行案例:

jmap -dump:format=b,file=test.bin 1713Dumping heap to /Users/handexing/test.bin ...Heap dump file created

option參數說明:

-dump:生成Java堆轉儲快照。格式為-dump:[live,]format=b,file=<filename>,其中live參數說明是否只dump出存活對象。-finalization:顯示在F-queue中等待Finalizer線程執行finalize方法的對象。-heap:顯示Java堆詳細信息。例如哪種回收器、參數配置、分代情況等。linux平臺下有效。-histo:顯示堆中對象統計信息,包括類、實例數量等。-permstat:以classloader為統計口徑顯示永久代內存狀態。linux平臺下有效。-F:當JVM對-dump沒有響應時,可以使用-F強制生成dump快照,linux平臺下有效。

5、jhat:JVM堆轉儲快照分析工具

與jmap命令搭配使用,用來分析jmap生成的堆轉儲快照。jhat內置了一個微型http/web伺服器,生成分析後的結果,可以在瀏覽器中查看(話說回來,實際情況中除非是真沒別的工具可用了,否則大多數人是不會直接用jhat來分析快照的)。也不建議在伺服器上使用jhat,會損耗伺服器性能。

jhat幫助文檔:

Usage:  jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>-J<flag>          Pass <flag> directly to the runtime system. For example, -J-mx512m to use a maximum heap size of 512MB-stack false:     Turn off tracking object allocation call stack.-refs false:      Turn off tracking of references to objects-port <port>:     Set the port for the HTTP server.  Defaults to 7000-exclude <file>:  Specify a file that lists data members that should be excluded from the reachableFrom query.-baseline <file>: Specify a baseline object dump.  Objects in both heap dumps with the same ID and same class will be marked as not being "new".-debug <int>:     Set debug level.   0:  No debug output   1:  Debug hprof file parsing   2:  Debug hprof file parsing, no server-version          Report version number-h|-help          Print this help and exit<file>            The file to readFor a dump file that contains multiple heap dumps,you may specify which dump in the fileby appending "#<number>" to the file name, i.e. "foo.hprof#3".All boolean options default to "true"

執行案例:

jhat test.bin  Reading from dump.bin...Dump file created Sat Feb 8 21:54:58 CST 2021Snapshot read, resolving...Resolving 271309 objects...Chasing references, expect 54 dots....Eliminating duplicate references....Snapshot resolved.Started HTTP server on port 7000Server is ready.

訪問localhost:7000可以查看分析結果。

6、jstack:Java堆棧跟蹤工具

用於生成JVM當時的線程快照。線程快照就是當前JVM內每一條線程正在執行的方法堆棧集合。生成快照主要用於定位線程長時間停頓的原因,例如死鎖、死循環、請求資源導致長時間掛起等。就可以排查到沒有相應的線程到底在幹什麼。
Usage:    jstack [-l] <pid>        (to connect to running process)    jstack -F [-m] [-l] <pid>        (to connect to a hung process)    jstack [-m] [-l] <executable> <core>        (to connect to a core file)    jstack [-m] [-l] [server_id@]<remote server IP or hostname>        (to connect to a remote debug server)Options:    -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)    -m  to print both java and native frames (mixed mode)    -l  long listing. Prints additional information about locks    -h or -help to print this help message

執行案例:

jstack -l 17132021-02-08 20:16:16Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.261-b12 mixed mode):"DestroyJavaVM" #53 prio=5 os_prio=31 tid=0x00007fa898808800 nid=0x1103 waiting on condition [0x0000000000000000]   java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:- None"http-nio-8080-AsyncTimeout" #51 daemon prio=5 os_prio=31 tid=0x00007fa898a4a000 nid=0x7903 waiting on condition [0x0000700007b0b000]   java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at org.apache.coyote.AbstractProtocol$AsyncTimeout.run(AbstractProtocol.java:1133)at java.lang.Thread.run(Thread.java:748)   Locked ownable synchronizers:- None

option參數說明:

-m:如果調用本地方法的話,顯示C/C++的堆棧。

Java調試進階工具單

btrace:https://github.com/btraceio/btracearthas:https://arthas.aliyun.com/doc/JProfiler:https://www.ej-technologies.com/products/jprofiler/overview.html簡單介紹了JVM中常用的命令,想要熟練使用還要在日常實際開發調試中經常使用,熟能生巧。希望這篇文章能給大家帶來幫助。喜歡加關注,後續持續更新!!!

相關焦點

  • 8款JVM性能調優監控工具(提高開發效率)
    遇到問題不可怕,關鍵是我們如何去排查這些錯誤,對症下藥才是根本。不過對於很多人來說,往往找不到這些問題的根本所在,因此這篇文章主要是讓我們掌握一些工具來分析到底是哪裡出現了問題。在之前的文章中,主要是分析了JVM的內存結構、類加載機制和垃圾回收機制。文章的順序也是循序漸進的,從這篇文章當中我們主要是分析JDK自帶的工具,把理論應用於實踐。
  • JVM性能調優實踐
    這裡有幾個比較重要的指標:當然,和CAP原則一樣,同時滿足一個程序內存佔用小、延遲低、高吞吐量是不可能的,程序的目標不同,調優時所考慮的方向也不同,在調優之前,必須要結合實際場景,有明確的的優化目標,找到性能瓶頸,對瓶頸有針對性的優化,最後進行測試,通過各種監控工具確認調優後的結果是否符合目標。
  • JAVA應用可視化診斷工具
    Compressed Class Space2.線程監控:相當於可視化的jstack命令JHSDB:基於服務性代理的調試工具(java9)JCMD、JHSDB整合了上一篇的命令HSDB圖形界面啟動方式java9: jhsdb hsdb --pid LVMIDjava8:在JDK/lib目錄下命令行執行:
  • 阿里內部都是這樣排查Java問題的,附工具單
    對排查方法性能時很有幫助,比如我之前這篇就是使用了trace命令來的:http://www.atatech.org/articles/52947。其他功能部分和btrace重合,可以選用,感興趣的請移步。
  • 一份超詳細的 Java 問題排查工具單
    排查利器btrace首當其衝的要說的是btrace。真是生產環境&預發的排查問題大殺器。簡介什麼的就不說了。對排查方法性能時很有幫助,比如我之前這篇就是使用了trace命令來的:<http://www.atatech.org/articles/52947>。其他功能部分和btrace重合,可以選用,感興趣的請移步。
  • 阿里排查Java問題工具清單!
    對排查方法性能時很有幫助,比如我之前這篇就是使用了trace命令來的:http://www.atatech.org/articles/52947。其他功能部分和btrace重合,可以選用,感興趣的請移步。
  • 阿里內部員工,排查Java問題常用的工具單
    文章內容做了部分刪減,主要刪減掉了其中只有阿里內部才能使用的工具的介紹,並刪減掉部分只有通過阿里內網才能訪問到的連結。真是生產環境&預發的排查問題大殺器。簡介什麼的就不說了。查詢資料聽說jstack和jmap等工具就是基於它的。
  • JVM之jvisualvm的簡單使用
    推薦閱讀•JVM之jconsole的簡單使用•性能優化-VisualVM工具的使用[3]•利用jvisualvm分析JVM,進行性能調優[4]•jvisualvm連接遠程應用終於成功,附踩大坑記錄!!(二:jmx方式)[6]•使用VisualVM監控遠程伺服器JVM[7]•java:jvm:jvisualvm安裝visualgc插件[8]•IBM:使用 VisualVM 進行性能分析及調優[9]引用連結[1] jvisualvm插件中心:: http://visualvm.github.io/pluginscenters.html
  • 大型企業JVM性能調優實戰Java垃圾收集器及gcroot
    02:JVM類加載機制大型企業JVM性能調優實戰之gcroot01:JVM類加載機制 - 類加載的生命周期概述java的class類文件實際上是二進位(字節碼)文件格式,class文件中包含了java虛擬機指令集和符號表以及若干其他輔助信息。
  • 5款強大的JVM 性能調優監控工具 !
    本文將對一些常用的JVM性能調優監控工具進行介紹,希望能起拋磚引玉之用。一、 jps(Java Virtual Machine Process Status Tool)      :基礎工具   jps主要用來輸出JVM中運行的進程狀態信息。語法格式如下:如果不指定hostid就默認為當前主機或伺服器。
  • 虛擬機性能監控、故障處理工具
    在JDK的bin目錄下提供了編譯、運行、打包、部署、籤名、調試、監控、運維等各種命令行工具,這些命令行工具體積都非常小,MAC版本的JDK11下可以看到大部分都在49K左右,並非JDK團隊刻意把他們製作的如此精煉、統一,而是因為這些命令行工具大多僅是一層薄包裝而已
  • JVM、GC 大串講,面試夠用了
    JVM JRE JDK的關係JVM(java虛擬機),將 .class 文件中的字節碼指令進行識別並調用作業系統向上的 API 完成動作。JVM不僅可以運行java程序,只要是能編譯成.class的文件都能運行。JRE (Java 運行時環境),包含了jvm和core lib。JDK (Java 開發工具包),它集成了jre和一些工具。
  • 一次完整的JVM堆外內存洩漏故障排查記錄
    前言記錄一次線上JVM堆外內存洩漏問題的排查過程與思路,其中夾帶一些「JVM內存分配的原理分析」以及「常用的JVM問題排查手段和工具分享」,希望對大家有所幫助。監控系統調出圖表查看:❞沙箱環境復現為了能還原當時的故障場景,我在沙箱環境申請了一臺壓測機器,來確保和線上環境一致。
  • java垃圾回收以及jvm參數調優概述
    常用監控工具 Java技術體系中所提倡的自動內存管理最終可以歸結為自動化地解決了兩個問題:給對象分配內存以及回收分配給對象的內存。另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息。
  • vSphere 虛擬化故障排查方法、工具總結
    vSphere 故障排查思想 針對 Virtual Machine 的故障排查針對 Storage 的故障排查
  • 乾貨|Java 線上故障排查完整套路!牛掰!
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫作者 | fredalxin來源丨https://fredal.xin/java-error-check
  • Java線上故障排查必備指南
    線上故障主要會包括 CPU、磁碟、內存以及網絡問題,而大多數故障可能會包含不止一個層面的問題,所以進行排查時候儘量四個方面依次排查一遍。同時例如 jstack、jmap 等工具也是不囿於一個方面的問題的,基本上出問題就是 df、free、top 三連,然後依次 jstack、jmap 伺候,具體問題具體分析即可。一般來講我們首先會排查 CPU 方面的問題。
  • vSphere 性能優化方法 & 故障排錯方法及工具總結 | 周末送資料
    故障排查方法、工具:vSphere 故障排查思想、針對 Virtual Machine 的故障排查、針對 Storage 的故障排查、針對 vCenter 和 ESXi 的故障排查、常用的故障排查工具箱。
  • JVM調優參數、方法、工具以及案例總結
    可能會影響性能,但可以消除內存碎片。-XX:+CMSIncrementalMode:設置為增量收集模式。一般適用於單CPU情況。-XX:CMSInitiatingOccupancyFraction=70:表示年老代內存空間使用到70%時就開始執行CMS收集,以確保年老代有足夠的空間接納來自年輕代的對象,避免Full GC的發生。
  • 5款新手常用的java編程工具,有你正在用的嗎?
    文:源碼時代新手如果想成為一名合格的java程式設計師工程師,不但要熟練使用各種框架,而且還有明白框架是如何實現的各種原理,例如像jvm虛擬機的原理,優化,熟練掌握jvm能讓你寫出性能更好的代碼,還有池技術,對象池,線程池等,目前人們對java編程的關注也越來越火熱,很多人對編程有很大的興趣,也想知道有哪些好用的java編程工具,接下來就為大家介紹幾款常用的相關編程工具