十一、JVM調優-命令篇

運行JVM自帶的命令可以方便的在生產監控和打印堆棧的日誌信息幫忙我們來定位問題!雖然JVM調優成熟的工具已經有很多:jconsole,大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生產環境出現問題的時候,一方面工具的使用會有所限制,另一方面我們總喜歡在出現問題的時候在終端輸入一些命令來解決。所有的工具幾乎都是依賴於JDK的接口和底層的這些命令,研究這些命令的使用也讓我們更能瞭解JVM的構成和特性。

Sun JDK監控和故障處理命令有jps jstat jmap jhat jstack jinfo下面做一一介紹。

1、jps 查看本機的Java中進程信息。
jps是JDK提供的一個查看當前Java進程的小工具,可以看做是Java Vritual Machine Process Status Tool的縮寫。非常簡單實用。
JVM Process Status Tool,顯示指定系統內所有的HotSpot虛擬機進程。
命令格式
jps [options][hostid]
option參數
. -l:輸出主類全面或jar路徑
. -q:只輸出LVMID
. -m:輸出JVM啓動時傳遞給main()的參數
. -v:輸出JVM啓動時顯示指定的JVM參數
其中[option],[hostid]參數也可以不寫。
示例
$ jps -l -m
28920 org.apache.catalina.startup.Bootstrap start
11589 org.apache.catalina.startup.Bootstrap start
25816 sun.tools.jps.Jps -l -m
2、jstack 打印線程的棧信息,製作線程Dump。
什麼是Java Dump?
Java虛擬機的運行時快照。將Java虛擬機運行時的狀態和信息保存到文件。
線程Dump,包含所有線程的運行狀態。純文本格式。
堆Dump,包含線程Dump,還包含所有堆對象的狀態。二進制格式。
Java Dump有什麼用?
補足傳統Bug分析手段的不足:可在任何Java環境使用;信息量充足。針對非功能正確性的Bug,主要爲:多線程開發,內存泄漏。

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

jstack用於生成java虛擬機當前時刻的線程快照。線程快照是當前java虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖,死循環,請求外部資源導致的長時間等待等。線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在後臺做什麼事情,或者等待什麼資源。如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕鬆地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息,如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。

所以jstack命令主要用來查看Java線程的調用堆棧的,可以用來分析線程問題(如死鎖)。

命令格式:
jstack[option]pid jstack [option] executable core
$jstack [option] [srever-id@]remote-hostname-or-IP
參數說明:
pid:java應用程序的進程號,一般可以通過jps來獲得;
executable:產生core dump的java可執行程序;
core:打印出的core文件;
remote-hostname-or-ip:遠程debug服務器的名稱或IP;
sever-id:唯一id;假如一臺主機上多個遠程debug服務;
option參數
. -F:當正常輸出請求不被響應時,強制輸出線程堆棧
. -l:除堆棧外,顯示關於鎖的附加信息
. -m:如果調用到本地方法的話,可以顯示C/C++的堆棧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章