java開發(fā) 線上問題排查命令詳解
前言
作為一個合格的開發(fā)人員,不僅要能寫得一手還代碼,還有一項很重要的技能就是排查問題。這里提到的排查問題不僅僅是在coding的過程中debug等,還包括的就是線上問題的排查。由于在生產(chǎn)環(huán)境中,一般沒辦法debug(其實有些問題,debug也白扯。。。),所以我們需要借助一些常用命令來查看運(yùn)行時的具體情況,這些運(yùn)行時信息包括但不限于運(yùn)行日志、異常堆棧、堆使用情況、GC情況、JVM參數(shù)情況、線程情況等。
給一個系統(tǒng)定位問題的時候,知識、經(jīng)驗是關(guān)鍵,數(shù)據(jù)是依據(jù),工具是運(yùn)用知識處理數(shù)據(jù)的手段。為了便于我們排查和解決問題,Sun公司為我們提供了一些常用命令。這些命令一般都是jdk/lib/tools.jar中類庫的一層薄包裝。隨著JVM的安裝一起被安裝到機(jī)器中,在bin目錄中。下面就來認(rèn)識一下這些命令以及具體使用方式。
jps
功能
jps位于jdk的bin目錄下,其作用是顯示當(dāng)前系統(tǒng)的java進(jìn)程情況,及其pid號。 jps相當(dāng)于Solaris進(jìn)程工具ps。不象"pgrep java"或"ps -ef grep java",jps并不使用應(yīng)用程序名來查找JVM實例。因此,它查找所有的Java應(yīng)用程序,包括即使沒有使用java執(zhí)行體的那種(例如,定制的啟動 器)。另外,jps僅查找當(dāng)前用戶的Java進(jìn)程,而不是當(dāng)前系統(tǒng)中的所有進(jìn)程。
常用指令
jps
:顯示當(dāng)前用戶的所有java進(jìn)程的PID
jps -v 3331
:顯示虛擬機(jī)參數(shù)
jps -m 3331
:顯示傳遞給main()函數(shù)的參數(shù)
jps -l 3331
:顯示主類的全路徑
jinfo
功能
jinfo可以輸出java進(jìn)程、core文件或遠(yuǎn)程debug服務(wù)器的配置信息。這些配置信息包括JAVA系統(tǒng)參數(shù)及命令行參數(shù),如果進(jìn)程運(yùn)行在64位虛擬機(jī)上,需要指明-J-d64參數(shù),如:jinfo -J-d64 -sysprops pid
jdk8中已經(jīng)不支持該命令。
常用指令
jinfo -flag CMSIniniatingOccupancyFration 3331
:查詢CMSIniniatingOccupancyFration參數(shù)值
jstat
功能
jstat(JVM Statistics Monitoring Tool)是用于監(jiān)控虛擬機(jī)各種運(yùn)行狀態(tài)信息的命令行工具。他可以顯示本地或遠(yuǎn)程虛擬機(jī)進(jìn)程中的類裝載、內(nèi)存、垃圾收集、JIT編譯等運(yùn)行數(shù)據(jù),在沒有GUI圖形的服務(wù)器上,它是運(yùn)行期定位虛擬機(jī)性能問題的首選工具。
常用指令
jstat -gc 3331 250 20
:查詢進(jìn)程2764的垃圾收集情況,每250毫秒查詢一次,一共查詢20次。
jstat -gccause
:額外輸出上次GC原因
jstat -calss
:查詢類裝載、類卸載、總空間以及所消耗的時間
jmap
功能
jmap是JDK自帶的工具軟件,主要用于打印指定Java進(jìn)程(或核心文件、遠(yuǎn)程調(diào)試服務(wù)器)的共享對象內(nèi)存映射或堆內(nèi)存細(xì)節(jié)。可以使用jmap生成堆轉(zhuǎn)儲快照(Heap Dump)。
常用指令
jmap -heap 3331
:查看java 堆(heap)使用情況
jmap -histo 3331
:查看堆內(nèi)存(histogram)中的對象數(shù)量及大小
jmap -histo:live 3331
:JVM會先觸發(fā)gc,然后再統(tǒng)計信息
jmap -dump:format=b,file=heapDump 3331
:將內(nèi)存使用的詳細(xì)情況輸出到文件,之后一般使用其他工具進(jìn)行分析。
jhat
功能
jhat(Java Heap Analysis Tool),是一個用來分析java的堆情況的命令。使用jmap命令可以生成Java堆的Dump文件。生成dump文件之后就可以用jhat命令,將dump文件轉(zhuǎn)成html的形式,然后通過http訪問可以查看堆情況。
由于有很多可視化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)可以替代,所以很少用。不過在沒有可視化工具的機(jī)器上也是可用的。
常用指令
jmap -dump:format=b,file=heapDump 3331
jhat heapDump
:解析Java堆轉(zhuǎn)儲文件,并啟動一個 web server
jstack
功能
jstack用于生成java虛擬機(jī)當(dāng)前時刻的線程快照。線程快照是當(dāng)前java虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現(xiàn)長時間停頓的原因,如線程間死鎖、死循環(huán)、請求外部資源導(dǎo)致的長時間等待等。
線程出現(xiàn)停頓的時候通過jstack來查看各個線程的調(diào)用堆棧,就可以知道沒有響應(yīng)的線程到底在后臺做什么事情,或者等待什么資源。
如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發(fā)生問題。
另外,jstack工具還可以附屬到正在運(yùn)行的java程序中,看到當(dāng)時運(yùn)行的java程序的java stack和native stack的信息, 如果現(xiàn)在運(yùn)行的java程序呈現(xiàn)hung的狀態(tài),jstack是非常有用的。
jstack命令主要用來查看Java線程調(diào)用堆棧的,可以用來分析線程問題(如死鎖)。
常用指令
jstack 3331
:查看線程情況
jstack -F 3331
:正常輸出不被響應(yīng)時,使用該指令
jstack -l 3331
:除堆棧外,顯示關(guān)于鎖的附件信息
常見問題定位過程
頻繁GC問題或內(nèi)存溢出問題
一、使用jps
查看線程ID
二、使用jstat -gc 3331 250 20
查看gc情況,一般比較關(guān)注PERM區(qū)的情況,查看GC的增長情況。
三、使用jstat -gccause
:額外輸出上次GC原因
四、使用jmap -dump:format=b,file=heapDump 3331
生成堆轉(zhuǎn)儲文件
五、使用jhat或者可視化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情況。
六、結(jié)合代碼解決內(nèi)存溢出或泄露問題。
死鎖問題
一、使用jps
查看線程ID
二、使用 jstack pid 查看線程情況
結(jié)語
經(jīng)常使用適當(dāng)?shù)奶摂M機(jī)監(jiān)控和分析工具可以加快我們分析數(shù)據(jù)、定位解決問題的速度,但也要知道,工具永遠(yuǎn)都是知識技能的一層包裝,沒有什么工具是包治百病的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java反射機(jī)制,如何將一個實體類所有字段賦值為null
這篇文章主要介紹了Java反射機(jī)制,如何將一個實體類所有字段賦值為null,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03springboot+thymeleaf+druid+mybatis 多模塊實現(xiàn)用戶登錄功能
這篇文章主要介紹了springboot+thymeleaf+druid+mybatis 多模塊實現(xiàn)用戶登錄功能,本文通過示例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07Java 進(jìn)階使用 Lambda 表達(dá)式實現(xiàn)超強(qiáng)的排序功能
今天要說的是第二種排序方式,在內(nèi)存中實現(xiàn)數(shù)據(jù)排序。這篇文章主要介紹了Java 進(jìn)階使用 Lambda 表達(dá)式實現(xiàn)超強(qiáng)的排序功能,需要的朋友可以參考下2021-11-11Java、JavaScript、Oracle、MySQL中實現(xiàn)的MD5加密算法分享
這篇文章主要介紹了Java、JavaScript、Oracle、MySQL中實現(xiàn)的MD5加密算法分享,需要的朋友可以參考下2014-09-09Java日期操作方法工具類實例【包含日期比較大小,相加減,判斷,驗證,獲取年份等】
這篇文章主要介紹了Java日期操作方法工具類,結(jié)合完整實例形式分析了java針對日期的各種常見操作,包括日期比較大小,相加減,判斷,驗證,獲取年份、天數(shù)、星期等,需要的朋友可以參考下2017-11-11Spring-AOP @AspectJ切點(diǎn)函數(shù)之@annotation()用法
這篇文章主要介紹了Spring-AOP @AspectJ切點(diǎn)函數(shù)之@annotation()用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07