由於java jdk命令行工具比較重要,加之看到一篇不錯的總結,所以接下來詳細講解。

很多java開發人員一旦發現應用無法響應、首先查看一下日誌、在查找日誌無果的情況下動不動就重啓java應用先讓其正常工作了再說。還有更爲誇張的是聽到過製作定時腳本每天半夜定時重啓、並笑着說重啓解決一切問題。

這種解決辦法顯然是下下策、經驗不足的表現。除了查看日至之外、對於java進程JVM的檢測其實sun公司提供了一套強大的虛擬機監視和故障處理工具。如果你對jdk有一點點了解、對於個java 進程的診斷其實就那麼回事、我們應該查找到根源問題、從本上找到ava進程不能正常工作的原因、從而達到治本的目的。

簡單來介紹一下jdk命令行工具是什麼

我們做java的肯定知道jdk的bin目錄下面有 java.exe、javac.exe這兩個命令行工具。但是除了這兩個工具還有一些其他的非常實用的工具、該篇文章主要就是介紹用於監視虛擬機和故障處理的工具。

JPS---虛擬機進程狀況工具

常用的參數:

-l 輸出Java應用程序的main class的完整包

-q 僅顯示pid,不顯示其它任何相關信息

-m 輸出傳遞給main方法的參數

-v 輸出傳遞給JVM的參數。在診斷JVM相關問題的時候,這個參數可以查看JVM相關參數的設置

注:這個命令相信大多數java程序員都知曉、查找當前運行的java進程、當需要kill掉某個進程的時候可以用到。

jstat ---虛擬機統計信息監視工具

jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] ,可以用來查看堆信息,垃圾回收信息等,詳細使用命令可以通過man jstat命令來查看。

查看垃圾回收信息

S0C:年輕代中第一個survivor(倖存區)的容量 (字節)

S1C:年輕代中第二個survivor(倖存區)的容量 (字節)

S0U:年輕代中第一個survivor(倖存區)目前已使用空間 (字節)

S1U:年輕代中第二個survivor(倖存區)目前已使用空間 (字節)

EC:年輕代中Eden(伊甸園)的容量 (字節)

EU:年輕代中Eden(伊甸園)目前已使用空間 (字節)

OC:Old代的容量 (字節)

OU:Old代目前已使用空間 (字節)

PC:Perm(持久代)的容量 (字節)

PU:Perm(持久代)目前已使用空間 (字節)

YGC:從應用程序啓動到採樣時年輕代中gc次數

YGCT:從應用程序啓動到採樣時年輕代中gc所用時間(s)

FGC:從應用程序啓動到採樣時old代(全gc)gc次數

FGCT:從應用程序啓動到採樣時old代(全gc)gc所用時間(s)

GCT:從應用程序啓動到採樣時gc用的總時間(s)

NGCMN:年輕代(young)中初始化(最小)的大小 (字節)

NGCMX:年輕代(young)的最大容量 (字節)

NGC:年輕代(young)中當前的容量 (字節)

OGCMN:old代中初始化(最小)的大小 (字節)

OGCMX:old代的最大容量 (字節)

OGC:old代當前新生成的容量 (字節)

PGCMN:perm代中初始化(最小)的大小 (字節)

PGCMX:perm代的最大容量 (字節)

PGC:perm代當前新生成的容量 (字節)

S0:年輕代中第一個survivor(倖存區)已使用的佔當前容量百分比

S1:年輕代中第二個survivor(倖存區)已使用的佔當前容量百分比

E:年輕代中Eden(伊甸園)已使用的佔當前容量百分比

O:old代已使用的佔當前容量百分比

P:perm代已使用的佔當前容量百分比

S0CMX:年輕代中第一個survivor(倖存區)的最大容量 (字節)

S1CMX :年輕代中第二個survivor(倖存區)的最大容量 (字節)

ECMX:年輕代中Eden(伊甸園)的最大容量 (字節)

DSS:當前需要survivor(倖存區)的容量 (字節)(Eden區已滿)

TT: 持有次數限制

MTT : 最大持有次數限制

jinfo java配置信息工具

觀察運行中的java程序的運行環境參數:參數包括Java System屬性和JVM命令行參數、也可以設置參數的值,並使之立即生效。

eg:

jmap Java內存映像工具

可以生成java應用程序的堆快照和對象統計信息。

下面的命令可以看到java進程中某一時刻的類示例數量以及所佔的字節數。

打印進程的類加載器和類加載器加載的持久代對象信息,輸出:類加載器名稱、對象是否存活(不可靠)、對象地址、父類加載器、已加載的類大小等信息。

1、使用jmap -heap pid查看進程堆內存使用情況,包括使用的GC算法、堆配置參數和各代中堆內存使用情況。

2、使用jmap -histo[:live] pid 查看堆內存中的對象數目、大小統計直方圖,如果帶上live則只統計活對象。

也可以將當前程序的堆快照導出到文件中:

jstack命令(Java Stack Trace)

可以用來查看java應用程序的堆棧信息。

jstack -l <pid>

可以用來查看進程中線程狀態,檢測死鎖等。

jstack可以定位到線程堆棧,根據堆棧信息可以定位到具體代碼,所以它在JVM性能調優中使用得非常多。下面我們來一個實例找出某個Java進程中最耗費CPU的Java線程並定位堆棧信息,用到的命令有ps、top、printf、jstack、grep。

1.:先找出Java進程ID,我部署在服務器上的Java應用名稱爲mrf-center:

得到進程ID爲21711

2.:找出該進程內最耗費CPU的線程 top -Hp pid

TIME列就是各個Java線程耗費的CPU時間,CPU時間最長的是線程ID爲21742的線程

printf"%x"21742得到21742的十六進制值爲54ee,下面會用到。

3.:jstack上場、它用來輸出進程21711的堆棧信息,然後根據線程ID的十六進制值grep,如下:

PS:可以看到CPU消耗在PollIntervalRetrySchedulerThread這個類的Object.wait(),我找了下我的代碼,定位到下面的代碼:

  • 來源:http://mp.weixin.qq.com/s/GJjlMVSx6HLIIefgajn8KQ
  • 程序員大咖整理發佈,轉載請聯繫作者獲得授權
相關文章