1. 程式人生 > >java虛擬機器常用命令工具

java虛擬機器常用命令工具

一、概述    
        程式執行中經常會遇到各種問題,定位問題時通常需要綜合各種資訊,如系統日誌、堆dump檔案、執行緒dump檔案、GC日誌等。通過虛擬機器監控和診斷工具可以幫忙我們快速獲取、分析需要的資料,進而提高問題解決速度。 本文將介紹虛擬機器常用監控和問題診斷命令工具的使用方法,主要包含以下工具: 
jps 顯示系統中所有Hotspot虛擬機器程序
jstat 收集Hotspot虛擬機器各方面執行資料
jstack 顯示虛擬機器的執行緒棧資訊
jinfo 顯示虛擬機器的配置資訊
jmap 用於生成虛擬機器的記憶體快照資訊

以上工具的官方文件地址: http://docs.oracle.com/javase/1.5.0/docs/tooldocs/ 
圖形化工具如jconsole,jvisualvm將另文介紹。 

二、示例程式碼
 
為方便大家使用各工具進行實戰,提供樣例程式碼如下: 

Java程式碼  收藏程式碼
  1. package com.leanworld;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. /** 
  5.  * 虛擬機器常用工具使用示例程式碼 啟動引數: -Xmn10m -Xms40m -Xmx40m 
  6.  *  
  7.  * @author learnworld 2012-1-30 下午01:37:14 
  8.  */  
  9. public class JVMTools {  
  10.     public static void createList(int count) throws
     InterruptedException {  
  11.         for (int j = 0; j < count; j++) {  
  12.             List<_1MObject> list = new ArrayList<_1MObject>();  
  13.             Thread.sleep(100);  
  14.             list.add(new _1MObject());  
  15.         }  
  16.     }  
  17.     public static void main(String[] args) throws InterruptedException {  
  18.         createList(5000);  
  19.     }  
  20. }  
  21. /** 
  22.  * 一個大約1M的物件 
  23.  */  
  24. class _1MObject {  
  25.     public byte[] _1M = new byte[1024 * 1024];  
  26. }  


三、工具介紹 
1.  jps 
JVM Process Status Tool,該命令用於列出正在執行的虛擬機器程序,顯示main類的名稱和虛擬機器程序id。該命令受當前使用者的訪問許可權影響,比如linux下非root使用者只列出當前使用者啟動的虛擬機器程序。 

命令格式: 
jps  [options]  [hostid] 

執行示例: 
$ jps -l 
3733 sun.tools.jps.Jps 
3700 com.leanworld.JVMTools
 
com.leanworld.JVMTools即為上面的示例程式碼執行類。 

常用引數: 
-l 輸出主類全名
-v 輸出虛擬機器程序啟動的jvm引數
-m 輸出啟動時傳遞給main函式的引數


2.  jstat 
JVM Statistics Monitoring Tool,用於監控各種執行狀態資訊的命令。在只有文字控制檯的環境中(如企業中的生產環境),該工具非常有用。 可以用來顯示系統中類裝載、垃圾回收、執行期編譯狀況等執行資料。 

命令格式: 
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] 
vmid表示虛擬機器唯一識別符號,如果是本地虛擬機器程序,與LVMID一致,通常為本地虛擬機器程序號。 interval表示查詢間隔時間,count表示查詢次數。如果省略interval和count引數,表示查詢一次。 

執行示例: 
$ jstat -gcutil 3700 500 4 
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
50.00   0.00  60.78   0.50  12.76    214    0.049     0    0.000    0.049 
  0.00  25.00  20.27   0.50  12.76    215    0.049     0    0.000    0.049 
  0.00  25.00  70.91   0.50  12.76    215    0.049     0    0.000    0.049 
50.00   0.00  20.27   0.50  12.76    216    0.049     0    0.000    0.049 

S0和S1表示Survivor0和Survivor1,E表示新生代Eden,O表示老年代Old,P表示持久代Permanent,以上各引數值表示已使用空間佔比。 YGC表示young gc次數,YGCT表示young gc總耗時。FGC表示Full gc次數,FGCT表示full gc總耗時。GCT表示所有gc總耗時時間。 

常用引數: 
class 類裝載相關資訊.
compiler JIT編譯器編譯過的方法、耗時等.
gc java堆資訊和垃圾回收狀況.
gccapacity 關注java堆各個區的最大和最小空間.
gccause 類似gcutil,額外輸出導致上一次gc的原因.
gcnew 新生代gc狀況.
gcnewcapacity 關注新生代gc使用的最大和最小空間.
gcold 老年代gc狀況.
gcoldcapacity 關注老年代gc使用的最大和最小空間.
gcpermcapacity 關注持久代gc使用的最大和最小空間.
gcutil 關注已使用空間佔總空間比例.
printcompilation 輸出已經被JIT編譯的方法.


3.  jstack 
Stack Trace for Java,用於生成虛擬機器當前的執行緒快照資訊,包含每一條執行緒的堆疊資訊。該命令通常用於定位執行緒停頓原因,當出現執行緒停頓時,可通過stack檢視每個執行緒的堆疊資訊,進而分析停頓原因。 
命令格式: 
jstack [ option ] pid 

執行示例: 
$ jstack 3700 
2012-01-30 16:36:05 
Full thread dump Java HotSpot(TM) Server VM (17.0-b16 mixed mode): 

"Attach Listener" daemon prio=10 tid=0xaca16c00 nid=0x1384 waiting on condition [0x00000000] 
   java.lang.Thread.State: RUNNABLE 

"Low Memory Detector" daemon prio=10 tid=0xaca00c00 nid=0x1366 runnable [0x00000000] 
   java.lang.Thread.State: RUNNABLE 

"CompilerThread1" daemon prio=10 tid=0x08e58800 nid=0x1365 waiting on condition [0x00000000] 
   java.lang.Thread.State: RUNNABLE 

"CompilerThread0" daemon prio=10 tid=0x08e56800 nid=0x1364 waiting on condition [0x00000000] 
   java.lang.Thread.State: RUNNABLE 

"Signal Dispatcher" daemon prio=10 tid=0x08e54c00 nid=0x1363 runnable [0x00000000] 
   java.lang.Thread.State: RUNNABLE 

"Finalizer" daemon prio=10 tid=0x08e39000 nid=0x1361 in Object.wait() [0xac943000] 
   java.lang.Thread.State: WAITING (on object monitor) 
at java.lang.Object.wait(Native Method) 
- waiting on <0xb10e0230> (a java.lang.ref.ReferenceQueue$Lock) 
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) 
- locked <0xb10e0230> (a java.lang.ref.ReferenceQueue$Lock) 
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) 
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) 

"Reference Handler" daemon prio=10 tid=0x08e34400 nid=0x1360 in Object.wait() [0xacb94000] 
   java.lang.Thread.State: WAITING (on object monitor) 
at java.lang.Object.wait(Native Method) 
- waiting on <0xb10e30d0> (a java.lang.ref.Reference$Lock) 
at java.lang.Object.wait(Object.java:485) 
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) 
- locked <0xb10e30d0> (a java.lang.ref.Reference$Lock) 

"main" prio=10 tid=0x08d7bc00 nid=0x135a waiting on condition [0xb6a8a000] 
   java.lang.Thread.State: TIMED_WAITING (sleeping) 
at java.lang.Thread.sleep(Native Method) 
at com.leanworld.JVMTools.createList(JVMTools.java:23) 
at com.leanworld.JVMTools.main(JVMTools.java:29) 

"VM Thread" prio=10 tid=0x08e31c00 nid=0x135f runnable 

"GC task thread#0 (ParallelGC)" prio=10 tid=0x08d83800 nid=0x135b runnable 

"GC task thread#1 (ParallelGC)" prio=10 tid=0x08d85000 nid=0x135c runnable 

"GC task thread#2 (ParallelGC)" prio=10 tid=0x08d86400 nid=0x135d runnable 

"GC task thread#3 (ParallelGC)" prio=10 tid=0x08d87c00 nid=0x135e runnable 

"VM Periodic Task Thread" prio=10 tid=0xaca02c00 nid=0x1367 waiting on condition 

JNI global references: 854
 
通過輸出資訊可以看出當前main執行緒處於TIMED_WAITING狀態,因為執行到示例程式碼中Thread.sleep(100);這行的緣故。 

常用引數: 
-l 除堆疊外,顯示鎖的附加資訊
-F 當請求不被響應時,強制輸出執行緒堆疊
-m 混合模式,列印java和本地C++呼叫的堆疊資訊


4. jinfo 
Configuration Info for Java,用於檢視和修改虛擬機器的各項引數資訊。 
命令格式: 
jinfo [ option ] pid 

執行示例: 
$jinfo 3700 
Attaching to process ID 5081, please wait... 
Debugger attached successfully. 
Server compiler detected. 
JVM version is 17.0-b16 
Java System Properties: 

java.runtime.name = Java(TM) SE Runtime Environment 
sun.boot.library.path = /home/learnworld/software/jdk1.6.0_21/jre/lib/i386 
java.vm.version = 17.0-b16 
java.vm.vendor = Sun Microsystems Inc. 
java.vendor.url = http://java.sun.com/ 
path.separator = : 
java.vm.name = Java HotSpot(TM) Server VM 
file.encoding.pkg = sun.io 
sun.java.launcher = SUN_STANDARD 
user.country = CN 
sun.os.patch.level = unknown 
java.vm.specification.name = Java Virtual Machine Specification 
user.dir = /home/learnworld/workspace/concurrency 
java.runtime.version = 1.6.0_21-b06 
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment 
java.endorsed.dirs = /home/learnworld/software/jdk1.6.0_21/jre/lib/endorsed 
os.arch = i386 
java.io.tmpdir = /tmp 
line.separator = 

... 

VM Flags: 
-Xmn10m -Xms40m -Xmx40m -Dfile.encoding=GBK -Xbootclasspath:/home/learnworld/software/jdk1.6.0_21/lib/tools.jar:/home/learnworld/software/jdk1.6.0_21/lib/sa-jdi.jar:/home/learnworld/software/jdk1.6.0_21/lib/jconsole.jar:/home/learnworld/software/jdk1.6.0_21/lib/htmlconverter.jar:/home/learnworld/software/jdk1.6.0_21/lib/dt.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/rt.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/resources.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/plugin.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/management-agent.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/jsse.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/jce.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/javaws.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/deploy.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/charsets.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/alt-rt.jar
 
可以看出,該命令可以方便我們查詢需要的虛擬機器資訊,包含System.getProperties()資訊。 

常用引數: 
-flag name 列印虛擬機器該引數對應的值.
-flag [+\-]name 使該引數生效或失效.
-flag name=value 修改相應引數的值.
-flags 列印傳給jvm的引數值.
-sysprops 列印System.getProperties()資訊.


5. jmap 
Memory Map for Java,可以產生堆dump檔案,查詢堆和持久代的詳細資訊等。 
命令格式: 
jmap [ option ] pid 

執行示例: 
$ jmap -dump:format=b,file=dump.tmp 3700 
Dumping heap to /home/learnworld/dump.tmp ... 
Heap dump file created
 
上面這個命令生成了dump.tmp這個dump檔案。生成的dump檔案可以使用Eclipse Memory Analyzer/jhat等工具進行分析。 

$ jmap -permstat 3700 
Attaching to process ID 3700, please wait... 
Debugger attached successfully. 
Server compiler detected. 
JVM version is 17.0-b16 
1355 intern Strings occupying 183024 bytes. 
finding class loader instances ..Finding object size using Printezis bits and skipping over... 
done. 
computing per loader stat ..done. 
please wait.. computing liveness....done. 
class_loader classes bytes parent_loader alive? type 

<bootstrap> 320 1437208   null  live <internal> 
0xb1170250 10 77120 0xb11706b8 live sun/misc/[email protected] 
0xb11706b8 0 0   null  live sun/misc/[email protected] 

total = 3 330 1514328     N/A    alive=3, dead=0     N/A
 

常用引數: 
-dump 生成堆dump檔案,格式為: -dump:[live,]format=b,file=<filename>
-heap 顯示java堆的詳細資訊,包括垃圾回收期、堆配置和分代資訊等
-histo 顯示堆中物件的統計資訊,包括類名稱,對應的例項數量和總容量
-permstat 統計持久代中各ClassLoader的統計資訊。


四、遇到的問題 
我的作業系統為ubuntu10.10,初次使用jinfo和jmap時出現以下錯誤: 
引用 Attaching to process ID 3538, please wait... 
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
解決方法: 
1. echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope 
該方法在下次重啟前有效。 

2. 永久有效方法 
sudo vi /etc/sysctl.d/10-ptrace.conf 
編輯下面這行: 
kernel.yama.ptrace_scope = 1 
修改為: 
kernel.yama.ptrace_scope = 0 
重啟系統,使修改生效。 
該bug詳細資訊請參考官方文件: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7050524 

相關推薦

java虛擬機器常用命令工具

一、概述             程式執行中經常會遇到各種問題,定位問題時通常需要綜合各種資訊,如系統日誌、堆dump檔案、執行緒dump檔案、GC日誌等。通過虛擬機器監控和診斷工具可以幫忙我們快速獲取、分析需要的資料,進而提高問題解決速度。 本文將介紹虛擬機器常用監控和問題診斷命令工具的使用方法,主要包含

Java虛擬機器效能監測工具Visual VM與OQL

1.Visual VM多合一工具 Visual VM是一個功能強大的多合一故障診斷和效能監控的視覺化工具,它集成了多種效能統計工具的功能,使用 Visual VM 可以代替jstat、jmap、jhat、jstack甚至是JConsole。在JDK 6 Update 7以後,Visual Vm便作為JDK的一

java虛擬機器記憶體監控工具jps,jinfo,Jstack,jstat,jmap,jhat使用

這裡將介紹幾款sun hotspot jvm 自帶的監控工具: 請確保java_home/bin配置到path環境變數下,因為這些工具都在jdk的bin目錄下 jps(JVM Process Status Tool):JVM機程序狀況工具 用來檢視基於Ho

《自己動手寫java虛擬機器》學習筆記(二)-----命令工具java

專案地址:https://github.com/gongxianshengjiadexiaohuihui 首先是Cmd的類 /** * @ClassName Cmd * @Description TODO * @Author Mr.G * @Date 2018/10/9 9:40

《自己動手寫java虛擬機器》學習筆記(一)-----命令工具(go)

     專案地址:https://github.com/gongxianshengjiadexiaohuihui 在今年三月份的時候,看過這本書,但是可能知識儲備不足,許多東西都一知半解,導致看到一半就看不下去了,現在覺得自己進步挺大的,決定重新拾起這本書,並且把

Java虛擬機器學習(8):檢視JVM引數及值的命令工具

檢視JVM各個引數值方式 1. HotSpot vm中的各個globals.hpp檔案  檢視jvm初始的預設值及引數 2.-XX:+PrintFlagsInitial引數 顯示所有可設定引數及預設值,可結

Java虛擬機器詳解(七)------虛擬機器監控和分析工具(1)——命令

  通過前面的幾篇部落格,我們介紹了Java虛擬機器的記憶體分配以及記憶體回收等理論知識,瞭解這些知識對於我們在實際生產環境中提高系統的執行效率是有很大的幫助的。但是話又說回來,在實際生產環境中,線上專案正在執行,我們怎麼去監控虛擬機器執行效率?又或者線上專案發生了OOM,異常堆疊資訊,我們又怎麼去抓取,然後

深入理解Java虛擬機器總結一虛擬機器效能監控工具與效能調優(三)

深入理解Java虛擬機器總結一虛擬機器效能監控工具與效能調優(三) JDK的命令列工具 JDK的視覺化工具 效能調優 JDK的命令列工具 主要有以下幾種: jps (Java Process Status Tool): 虛擬機器程序

讀書筆記 ---- 《深入理解Java虛擬機器》---- 第4篇:虛擬機器效能監控與故障處理工具

上一篇:垃圾收集器:https://blog.csdn.net/pcwl1206/article/details/84197088 本文轉自:https://blog.csdn.net/WSYW126/article/details/62422005 第4篇:虛擬機器效能監控與故障處理工具

【深入理解 Java 虛擬機器筆記】虛擬機器效能監控與故障處理工具

3.虛擬機器效能監控與故障處理工具 定位問題時,知識和經驗是關鍵基礎、資料(執行日誌、異常堆疊、GC日誌、執行緒快照、堆轉儲快照)是依據、工具是運用知識處理資料的手段。 思維導圖 JDK的命令列工具 jps: 虛擬機器程序狀況工具 jps(JVM Proce

Linux基礎_常用虛擬機器管理命令

常用虛擬機器管理命令 1.顯示正在執行的虛擬機器,由下圖可知rhel7.1這個虛擬機器處於執行狀態,其餘的虛擬機器都處於關閉狀態。 [[email protected] Desktop]# v

深入理解Java虛擬機器(四)——JVM效能調優監控工具

Jinfo 檢視正在執行的Java應用程式的擴充套件引數 檢視jvm的引數 檢視java系統引數 Jstat jstat命令可以檢視堆記憶體各部分的使用量,以及載入類的數量。命

java-關於java_home配置,classpath配置和javac,java命令,javac編譯器,和java虛擬機器之間的關係

在每個人學習java的第一步,都是安裝jdk ,jre,配置java_home,classpath,path。 為什麼要做這些?在閱讀java-core的時候,看到了原理,p141。 一   關於類的共享   為了使類能被多個程式共享,需要做到以下幾步:   1.把類放到同一個目錄中,且該目錄是pa

(轉)Java服務化系統線上應急和技術攻關,你必須擁有的那些應用層指令碼和Java虛擬機器命令

原文部落格:https://www.jianshu.com/p/46a120f9e5a3無論是技術開發人員還是架構設計人員都是在實踐中成長起來的,他們通過實踐進行總結,總結後把經驗昇華並再次應用到實踐中去,進一步提供生產效率。 本文介紹筆者在網際網路公司裡線上應急和技術攻關過程中積累的應用層指令碼和Java虛

Java虛擬機器詳解03----常用JVM配置引數

本文主要內容: Trace跟蹤引數 堆的分配引數 棧的分配引數 零、在IDE的後臺列印GC日誌: 既然學習JVM,閱讀GC日誌是處理Java虛擬機器記憶體問題的基礎技能,它只是一些人為確定的規則,沒有太多技術含量。 既然如此,那麼在I

Java虛擬機器探究】5.常用JVM配置引數-棧的分配引數

在使用JVM編譯java時,都會去設定相關的引數(例如使用eclipse的時候,可以設定eclipse的eclipse.ini檔案來對jvm做一些引數配置)。jvm的引數設定主要涉及到三種,分別是Trace跟蹤引數、堆的分配引數、棧的分配引數。本章主要講解棧的分配引數的相關資

java虛擬機器記憶體檢視相關命令

關於cmd命令的重定向輸出 :[url]http://blog.csdn.net/jw72jw/article/details/7404255[/url]jstack和執行緒dump分析:[url]http://jameswxx.iteye.com/blog/1041173[

Java虛擬機器工具之堆疊跟蹤工具jstack檢測死鎖

jstack是一個很實用的工具,不僅能定位到死迴圈的位置,還能找到死鎖的位置,這個工具對我們直接在生產機上定位錯誤帶來了極大的方便,尤其是那些不容易復現的錯誤。 首先呢,先寫一個能產生死鎖的程式碼。程式碼邏輯很簡單,咱就產生兩個執行緒,兩個執行緒分別執行加鎖與

Java虛擬機器工具之堆疊跟蹤工具jstack檢測物件wait方法

wait()方法源於Object類,當執行緒呼叫wait的時候,意思就是說執行緒會放棄物件鎖,進入等待此物件的等待鎖定池。 下面看看用jstack怎麼定位wait方法。 首先寫一段簡單的呼叫wait的程式碼: import java.util.conc

Java虛擬機器詳解----常用JVM配置引數

原文地址:http://www.cnblogs.com/smyhvae/p/4736162.html 本文主要內容: Trace跟蹤引數堆的分配引數棧的分配引數 零、在IDE的後臺列印GC日誌: 既然學習JVM,閱讀GC日誌是處理Java虛擬機器記憶體問題的