java虚拟机常用命令工具
生活随笔
收集整理的這篇文章主要介紹了
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.? 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/Launcher$AppClassLoader@0xad34eb70
0xb11706b8 0 0 ? null? live sun/misc/Launcher$ExtClassLoader@0xad303d40
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虚拟机常用命令工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu vnc 远程连接桌面
- 下一篇: kill所有java进程