Java內(nèi)存泄漏分析系列之一:使用jstack定位線程堆棧信息
Java內(nèi)存泄漏分析系列之二:jstack生成的Thread Dump日志結(jié)構(gòu)解析
Java內(nèi)存泄漏分析系列之三:jstat命令的使用及VM Thread分析
Java內(nèi)存泄漏分析系列之四:jstack生成的Thread Dump日志線程狀態(tài)
Java內(nèi)存泄漏分析系列之五:常見的Thread Dump日志案例分析
Java內(nèi)存泄漏分析系列之六:JVM Heap Dump(堆轉(zhuǎn)儲文件)的生成和MAT的使用
查看JVM參數(shù)
jps -l 查看所有正在運(yùn)行的Java程序,同時顯示啟動類類名,獲取到PID
4706 org.apache.catalina.startup.Bootstrap
5023 sun.tools.jps.Jps
jinfo -flags PID 查看運(yùn)行時進(jìn)程參數(shù)與JVM參數(shù)
Attaching to process ID 28987, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.171-b11
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=132120576 -XX:MaxHeapSize=2092957696 -XX:MaxNewSize=697303040 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44040192 -XX:OldSize=88080384 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
Command line: -Dspring.config.location=application.properties -Dspring.profiles.active=staging
java -XX:+PrintFlagsFinal -version 查看當(dāng)前虛擬機(jī)默認(rèn)JVM參數(shù)
查看即時GC狀態(tài)
jstat -gc PID 1000 10 每秒查看一次gc信息,共10次
輸出比較多的參數(shù),每個字段的解釋參看 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
512.0 512.0 15.3 0.0 4416.0 1055.2 11372.0 7572.5 14720.0 14322.5 1664.0 1522.8 40 0.137 8 0.039 0.176
期間可能碰到提示sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 24.181-b01. Target VM is 25.171-b11的問題,原因在于安裝了多個版本,使用which、ls -l可簡介定位到與當(dāng)前執(zhí)行Java程序相同的Java版本
內(nèi)存問題
內(nèi)存泄露導(dǎo)致OOM?內(nèi)存占用異常的高?這是生產(chǎn)環(huán)境常常出現(xiàn)的問題,Java提供dump文件供我們對內(nèi)存里發(fā)生過的事情進(jìn)行了記錄,我們需要借助一些工具從中獲取有價值的信息。
導(dǎo)出Dump文件
- 提前對Java程序加上這些參數(shù)印dump文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ - 對正在運(yùn)行的程序使用jmap:
jmap -dump:format=b,file=heap.hprof PID
分析Dump文件
如果Dump文件不太大的話,可以傳到 http://heaphero.io/index.jsp 來分析
文件比較大,且想進(jìn)行更加系統(tǒng)的分析,推薦使用MAT分析,有如下幾種常用查看方式
- 首頁中的【Leak Suspects】能推測出問題所在
- 點(diǎn)擊【Create a histogram from an arbitrary set of objects】查到所有對象的數(shù)量
- 右鍵點(diǎn)擊某個對象【Merge Shortest Paths to GC Roots】-> 【exclude all phantom/weak/soft etc. references】能查詢到大量數(shù)量的某個對象是哪個GC ROOT引用的
線程問題
任務(wù)長時間不退出?CPU 負(fù)載過高?很可能因為死循環(huán)或者死鎖,導(dǎo)致某些線程一直執(zhí)行不被中斷,但是不報錯是最煩人的,所以日志里看不到錯誤信息,并且又不能用dump文件分析,因為跟內(nèi)存無關(guān)。這個時候就需要用線程分析工具來幫我們了。
導(dǎo)出jstack文件
使用jstack PID > 文件,如果失敗請加-F參數(shù),如果還失敗請使用Java程序啟動時使用的用戶執(zhí)行jstack
排查步驟
-
top查看到哪個java程序負(fù)載高 -
top -p PID -H查看該進(jìn)程所有進(jìn)程的運(yùn)行狀態(tài) - 記錄下高負(fù)載的線程ID,
printf "&x" PID轉(zhuǎn)換成16進(jìn)制 jstack PID > 文件- 在jstack文件中用轉(zhuǎn)換成16進(jìn)制之后的線程ID查詢線程運(yùn)行堆棧
- 從堆棧中了解到線程在執(zhí)行什么任務(wù),并結(jié)合業(yè)務(wù)與代碼判斷問題所在
以下轉(zhuǎn)載自: http://www.codingwhy.com/view/858.html
Java開發(fā)人員肯定都知道JDK的bin目錄中有“java”、“javac”這兩個命令行工具,但并非所有的程序員都了解過JDK的bin目錄之中的其他工具的作用。
這些工具被Sun公司作為“禮物”附贈給JDK的使用者,并在軟件的使用說明中把他們申明為“沒有技術(shù)支持并且是試驗性質(zhì)的(unsupported and experimental)”的產(chǎn)品,但事實上,這些工具都非常的穩(wěn)定且功能強(qiáng)大,能在處理應(yīng)用程序性能問題、定位故障時發(fā)揮很大的作用。
細(xì)心的可能會發(fā)現(xiàn),這些工具都非常小,是因為這些工具大多是jdk/lib/tools.jar類庫的一層包裝而已,他們主要的功能代碼是在tools類庫中實現(xiàn)的。
Java故障檢修,程序概要分析,監(jiān)視和管理工具
| 工具名稱 | 用途 |
|---|---|
| jvisualvm | 一個圖形化的Java虛擬機(jī) 參考: Java jvisualvm簡要說明 |
| jconsole | java監(jiān)視臺和管理控制臺 參考: 如何利用 JConsole觀察分析Java程序的運(yùn)行,進(jìn)行排錯調(diào)優(yōu) https://www.ibm.com/support/knowledgecenter/zh/SSYKE2_8.0.0/com.ibm.java.vm.80.doc/docs/jconsole.html |
| jps | JVM Process Status進(jìn)程狀態(tài)工具。列出目標(biāo)系統(tǒng)的HotSpot JJVM 可以列出本機(jī)所有java進(jìn)程的pid |
| jstat | 按照命令行的具體要求記錄和收集一個JVM的性能數(shù)據(jù) |
| jstatd | JVM jstat 的守護(hù)進(jìn)程 |
| jmc | Java任務(wù)控制工具(Java Mission Control),主要用于HotSpot JVM的生產(chǎn)時間監(jiān)測、分析、診斷。 |
故障檢測和修理工具
| 工具名稱 | 用途 |
|---|---|
| jinfo | 配置或打印某個Java進(jìn)程VM flag |
| jhat | 堆儲存查看器 |
| jmap | Java內(nèi)存圖 |
| jsadebugd | Java的 Serviceability Agent Debug的守護(hù)進(jìn)程 |
| jstack | Java堆棧跟蹤 |
JVM性能調(diào)優(yōu)監(jiān)控工具jps、jstack、jmap、jhat、jstat、hprof使用詳解
基本工具
這些工具是JDK的基礎(chǔ),用這些工具來編寫應(yīng)用程序。
| 工具名稱 | 用途 |
|---|---|
| javac | Java語言編譯器 |
| java | Java應(yīng)用程序啟動器 |
| javaw | Java運(yùn)行工具,用于運(yùn)行.class字節(jié)碼文件或.jar文件,但不會顯示控制臺輸出信息,適用于運(yùn)行圖形化程序。 |
| javadoc | Java API文檔生成器 |
| apt | java 注解處理器 「深入Java」Annotation注解 |
| appletviewer | java applet小程序查看器 |
| jar | java文件壓縮打包工具 |
| jdb | Java調(diào)試器 |
| javah | C頭文件和stub生成器,用于寫本地化方法,例如生產(chǎn)JNI樣式的頭文件 |
| javap | class文件反編譯工具 |
| extcheck | 用于檢測jar包中的問題 |
| jcmd | Java命令行(Java Command),用于向正在運(yùn)行的JVM發(fā)送診斷命令請求。 |
安全工具
這些工具用于設(shè)置系統(tǒng)的安全規(guī)則和生產(chǎn)可以工作在遠(yuǎn)端的安全規(guī)則下的應(yīng)用程序
| 工具名稱 | 用途 |
|---|---|
| keytool | 管理密鑰庫和證書 |
| jarsigner | 生產(chǎn)和校驗JAR簽名 |
| policytool | 有用戶界面的規(guī)則管理工具 |
| kinit | 用于獲得和緩存網(wǎng)絡(luò)認(rèn)證協(xié)議Kerberos 票證的授予票證 |
| klist | 憑據(jù)高速緩存和密鑰表中的 Kerberos 顯示條目 |
| ktab | 密鑰和證書管理工具 |
Java國際化工具
這些工具可以幫助你創(chuàng)建可本地化的應(yīng)用程序
native2ascii
遠(yuǎn)程方法調(diào)用工具
這些工具可以幫助創(chuàng)建可以和web和網(wǎng)絡(luò)交互的應(yīng)用程序
| 工具名稱 | 用途 |
|---|---|
| rmic | 生成遠(yuǎn)程對象的stubs and skeletons(存根和框架) |
| rmid | Java遠(yuǎn)程方法調(diào)用(RMI:Remote Method Invocation)活化系統(tǒng)守護(hù)進(jìn)程 |
| rmiregistry | Java遠(yuǎn)程對象注冊表 |
| serialver | 返回類的 serialVersionUID |
| java-rmi | Java遠(yuǎn)程方法調(diào)用(Java Remote Method Invocation)工具,主要用于在客戶機(jī)上調(diào)用遠(yuǎn)程服務(wù)器上的對象 |
Java IDL and RMI-IIOP 工具
這些工具用于創(chuàng)建使用OMG-Standard IDL 和 CORBA/IIOP 的應(yīng)用程序
| 工具名稱 | 用途 |
|---|---|
| tnameserv | Java IDL瞬時命名服 |
| idlj | 生產(chǎn)映射到OMG IDL接口可以使Java應(yīng)用程序使用CORBA的.java文件 |
| orbd | 為客戶可以在CORBA環(huán)境下透明的定位和調(diào)用服務(wù)器的穩(wěn)定的對象提供支持 |
| servertool | 為應(yīng)用程序提供易于使用的接口用于注冊,注銷,啟動,關(guān)閉服務(wù)器 |
Java部署工具
| 工具名稱 | 用途 |
|---|---|
| pack200 | 使用java gzip壓縮工具將JAR文件轉(zhuǎn)換為壓縮的pack200文件,生產(chǎn)打包文件是高度壓縮的JAR包,可以直接部署,減少下載時間 |
| unpack200 | 解包pack200文件為JARs |
Java web工具
| 工具名稱 | 用途 |
|---|---|
| javaws | Java web 啟動命令行工具 |
| schemagen | Java構(gòu)架的XML Schema生成器 |
| wsgen | 生成 JAX-WS |
| wsimport | 生成 JAX-WS |
| xjc | 綁定編譯器 |
Java腳本工具
| 工具名稱 | 用途 |
|---|---|
| jrunscript | 運(yùn)行腳本 |
其他工具
| 工具名稱 | 用途 |
|---|---|
| jabswitch | Java Access Bridge Switch的簡稱,用于控制Java訪問橋的開/關(guān)。Java訪問橋是一種技術(shù),讓Java應(yīng)用程序?qū)崿F(xiàn)Accessibility API,以供Microsoft Windows系統(tǒng)的輔助技術(shù)訪問。 |
| javafxpackager | JavaFX打包工具 |