常見的監控JVM的幾個Linux命令和使用


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM