jps
[root@xxx bin]# jps -l 2007
bash: jps: command not found
[root@xxx bin]# /opt/jdk1.8.0_181/bin/jps -q 116471
RMI Registry not available at 116471:1099
Exception creating connection to: 116471; nested exception is:
java.net.SocketException: Invalid argument or cannot assign requested address
一、監控管理工具
以下三個命令常用於監視JVM虛擬機性能及資源消耗情況:
1、jps-Java Virtual Machine Process Status Tool
使用說明: 該命令用於列出目標系統上正在運行的虛擬機進程(每個java程序會獨占一個java虛擬機實例)。所列信息包括進程ID及虛擬機執行主類名稱,對於非root賬戶,只能顯示當前用戶啟動的虛擬機進程。值得注意的是,java程序啟動后,默認會在/tmp/hsperfdata_${user_name}目錄下以該進程ID為文件名的文件,並將jvm運行相關信息存儲其中,其中user_name是當前用戶名。出現無法查看時,可能是磁盤讀寫、目錄權限;臨時文件丟失;java進程信息文件存儲地址唄設置(-Djava.io.tmpdir)等問題。
命令格式:
jps [opions] [hostid]
options: 命令行選項;hostid:RMI注冊表中注冊的主機名,默認是localhost
參數詳解:
選項 |
描述 |
-q |
只顯示進程ID |
-m |
顯示傳遞給main方法的參數 |
-l |
顯示執行主類全名,jar則為其所在全路徑 |
-v |
顯示傳遞給JVM的命令行參數 |
2、jstat-Java Virtual Machine Statistics Monitoring Tool
使用說明: 該命令用於輸出給定java進程的統計信息。在只有控制台的環境中(比如生產環境),該命令十分奏效。我們主要通過它可以顯示系統中垃圾回收、類裝載、運行期編譯狀況等數據。
命令格式:
jstat [generalOpion] [outputOptions] vmid [interval][s|ms] [count]]
generalOptions: 常規命令行選項,如-version,-options;
outputOptions:輸出選項;
vmid:進程ID;
interval[s|ms]:采樣間隔,默認是毫秒;
count:采樣次數;
參數詳解:
選項 |
描述 |
-class |
類裝載器的行為統計 |
-gc |
垃圾回收堆的行為統計 |
-gccapacity |
各個垃圾回收代(young,old,perm)和它們的相應空間統計 |
-gcutil |
垃圾回收統計概述 |
-gccause |
同-gcutil,但會額外輸出導致上一次GC產生原因 |
-gcnew |
監視新生代GC狀況 |
-gcnewcapacity |
同-gcnew,但主要關注使用到的最大和最小空間 |
-gcold |
監視老年代GC狀況 |
-gcoldcapacity |
同-gccold,輸出主要關注使用到的最大和最小空間 |
-gcpermacapacity |
輸出永久代使用到的最大和最小空間 |
-compiler |
輸出JIT編譯器編譯過的方法、耗時等信息 |
-printcompilation |
輸出已經被JIT編譯的方法 |
備注:
1)JIT 即時編譯技術,能夠加速java程序的執行速度,JIT編譯器將字節碼編譯成本機機器碼
2)JVM堆結構
Sun JVM分代垃圾回收器把堆空間分成3塊:
Young Gen:年輕代,包括1個Eden區和2個Suvivor區,新創建的對象(大部分為短周期的對象)將進入這個區,虛擬機會頻繁地對這個區進行垃圾回收。
Old Gen:年老代,當對象在Young Gen呆地足夠久(經過幾次的垃圾回收仍然存在)或Young Gen空間不足時,對象將進入Old Gen,由於一般是生命周期比較長的對象,因此虛擬機對這塊內存的回收頻度會比較低,一旦回收,使用的將是一個耗時的Full GC,另外,一旦堆空間不足時,虛擬機也會嘗試去回收這個區。
Perm Gen:持久代,一些常量定義和類、方法聲明及其bytecode都會放在這個區
3、jstatd-Virtual Machine jstat Daemon
使用說明: 此命令將開啟一個RMI服務器程序,提供了對JVM的創建和結束監視,也為遠程監視工具提供了一個可以attach的接口。啟動它之前需要首先為其制定安全策略,創建策略穩健,並命名為jstatd.all.policy,啟動時,命令為jstatd -J-Djava.security.policy=jstatd.all.policy。策略穩健內容如下:
grant codebase ”file{java.home}/../lib/tools.jar” {
permission java.security.AllPermission;
};
命令格式:
jstatd [options]
options: 命令行選項;
參數詳解:
選項 |
描述 |
-nr |
當一個存在的RIM Registry沒有找到時,補倉是創建一個內部的RMI Registry |
-p |
port端口號,默認為1099 |
-n |
RMI Registray中注冊的遠程RMI對象名稱 |
-J |
JVM參數 |
二、故障診斷工具
以下三個命令常用於完成特定故障診斷任務:
1、jinfo-Configuration Info
使用說明: 該命令作用是實時查看或調整JVM運行環境參數。如果想知道顯式指定的虛擬機參數,可以采用jps -v,但是如果想知道默認的相關虛擬機參數值,只能借助該命令來做。
命令格式:
jinfo [option] pid
options: 命令行選項;pid:java進程ID;
參數詳解:
選項 |
描述 |
-flag <name> |
打印指定VM參數值 |
-flag [+|-]<name> |
更改VM參數生效與否 |
-flag <name>=<value> |
設置VM參數為指定值 |
-h |
打印幫助信息 |
-help |
同-h |
2、jmap-Memory Map
使用說明: 該命令用於生成堆轉存快照,使用jmap可以查看heap空間的概要情況,粗略的掌握heap的使用情況。也可以生成heapdump文件,再使用jhat通過web瀏覽器具體分析內容中的對象和數據。
命令格式:
jmap [option] vmid
options: 命令行選項;pid:java進程ID;
參數詳解:
選項 |
描述 |
-dump |
生成堆轉存快照 |
-finalizerinfo |
顯示等待finalize方法的對象 |
-heap |
顯示堆詳細信息 |
-histo |
顯示堆中對象統計信息 |
-permstat |
以classloader為統計口徑顯示永久代內存狀態 |
-F |
當虛擬機進程對-dump選項無響應時,可使用這個選項強制生成 |
3、jstack-Stack Trace
使用說明: 該命令用於生成JVM當前時刻的線程快照。線程出現停頓的時候通過jstack來查看各個線程的調用堆棧,就可知道沒有響應的線程到底在后台做些什么事情,或者等待什么資源。
命令格式:
jstack [option] vmid
options: 命令行選項;pid:java進程ID;
參數詳解:
選項 |
描述 |
-F |
強制輸出線程堆棧 |
-m |
如調用本地方法的話,可顯示C/C++堆棧 |
-l |
出堆棧外,顯示關於鎖的附加信息 |
在生產環境中,jstack命令幫助解決內存泄露引起的垃圾回收線程占用高CPU,以及服務線程阻塞在某個遠程接口處導致無響應等問題。列出子線程的cpu占用率等情況,再對照jstack命令得到的線程號,就可以知道cpu占用高的線程執行到了那里:
ps -eL -o pid,%cpu,lwp|grep -i 16907