對于線上使用者來說,常常因為流量過高,程式bug,依賴故障,線程死鎖,配置錯誤等導緻系統不用下面介紹一些常用Java故障工具排除問題。
一、常用工具:
JDK 自身提供了一系列的Java故障排除工具,雖然簡單,但是十分有用。
1,jps
jps用來輸出一些JVM虛拟機的程序資訊,類似于Linux的ps指令, ,它的作用是顯示目前系統的java程序情況,及其id号。我們可以通過它來檢視我們到底啟動了幾個java程序(因為每一個java程式都會獨占一個java虛拟機執行個體),和他們的程序号(為下面幾個程式做準備),并可通過opt來檢視這些程序的詳細啟動參數。
jps的用法:
-q :隻顯示pid,不顯示class名稱,jar檔案名和傳遞給 main 方法的參數
-m :輸出程序啟動時候傳遞給main函數的參數
-l :輸出應用程式main class的完整package名或者應用程式的jar檔案完整路徑名
-v:輸出傳遞給JVM的參數
[root@localhost ~]# jps -v
30319 Bootstrap -Djava.util.logging.config.file=/usr/local/webserver/apache-tomcat-cms
注:jps指令似乎隻能顯示目前使用者的java程序,要顯示其他使用者的還是隻能用unix/linux的ps指令
2、jstat
jstat是一個可以用來對虛拟機各站運作狀态進行監控的工具,,通過它可以看到虛拟機的類加載,與解除安裝,管理記憶體使用和垃圾收集資訊,監視JIT及時編譯器的運作情況。一般是運作期定位問題的首選
jstat的用法:
jstat -class pid:顯示加載class的數量,及所占空間等資訊。
jstat -compiler pid:顯示VM實時編譯的數量等資訊。
jstat -gc pid:可以顯示gc的資訊,檢視gc的次數,及時間。其中最後五項,分别是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。
jstat -gccapacity:可以顯示,VM記憶體中三代(young,old,perm)對象的使用和占用大小,如:PGCMN顯示的是最小perm的記憶體使用量,PGCMX顯示的是perm的記憶體最大使用量,PGC是目前新生成的perm記憶體占用量,PC是但前perm記憶體占用量。其他的可以根據這個類推, OC是old内純的占用量。
jstat -gcnew pid:new對象的資訊。
jstat -gcnewcapacity pid:new對象的資訊及其占用量。
jstat -gcold pid:old對象的資訊。
jstat -gcoldcapacity pid:old對象的資訊及其占用量。
jstat -gcpermcapacity pid: perm對象的資訊及其占用量。
jstat -util pid:統計gc資訊統計。
jstat -printcompilation pid:目前VM執行的資訊。
除了以上一個參數外,還可以同時加上 兩個數字,如:jstat -printcompilation 3024 250 6是每250毫秒列印一次,一共列印6次,還可以加上-h3每三行顯示一下标題。
[root@localhost ~]# jstat -class 32388(pid)
Loaded Bytes Unloaded Bytes Time
9012 18808.3 191 301.6 54.46
3.jinfo
用于檢視應用程式的配置參數,以及列印運作jvm時所指定的jvm參數。
觀察運作中的java程式的運作環境參數:參數包括Java System屬性和JVM指令行參數
執行個體:jinfo 2083
其中2083就是java程序id号,可以用jps得到這個id号。
[root@localhost ~]# jinfo (-flags) 30823 (id)
Attaching to process ID 30823, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.1-b03
jstack:
可以觀察到jvm中目前所有線程的運作情況和線程目前狀态
用來生産虛拟機目前的線程快照資訊,線程快照資訊是目前虛拟機每一個線程正在執行的方法堆棧的集合,生産線程快照的目的是主要是為了定位線程長時間沒有響應的原因,如,線程死鎖,網絡請求.
ms/temp
[root@localhost ~]# jstack 30823
2014-11-14 17:52:57
Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.1-b03 mixed mode):
"Attach Listener" daemon prio=10 tid=0x00007f91e0001800 nid=0x77e waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"MultiThreadedHttpConnectionManager cleanup" daemon prio=10 tid=0x00007f919814f000 nid=0x7907 in Object.wait() [0x00007f9210e4f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x00000007037c9800> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ReferenceQueueThread.run(MultiThreadedHttpConnectionManager.java:1122)
.
.jmap:
可以檢視等待回收對象的隊列,檢視堆的概要資訊,以及通過JVM參數指定各記憶體的空間大小,通過jvm堆快照轉儲快照,可以查找記憶體洩露等問題。
-heap:列印jvm heap的情況
-histo:列印jvm heap的直方圖。其輸出資訊包括類名,對象數量,對象占用大小。
-histo:live :同上,但是隻答應存活對象的情況
-permstat:列印permanent generation heap情況
[root@localhost ~]# jmap -heap 30823
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 4294967296 (4096.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 536870912 (512.0MB)
MaxPermSize = 536870912 (512.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 1267531776 (1208.8125MB)
used = 623225224 (594.353889465332MB)
free = 644306552 (614.458610534668MB)
49.16841027581466% used
From Space:
capacity = 83034112 (79.1875MB)
used = 38528120 (36.74327850341797MB)
free = 44505992 (42.44422149658203MB)
46.40035170123816% used
To Space:
capacity = 81068032 (77.3125MB)
used = 0 (0.0MB)
free = 81068032 (77.3125MB)
0.0% used
PS Old Generation
capacity = 2863333376 (2730.6875MB)
used = 166141280 (158.44467163085938MB)
free = 2697192096 (2572.2428283691406MB)
5.802372905389554% used
PS Perm Generation
capacity = 536870912 (512.0MB)
used = 77216208 (73.63911437988281MB)
free = 459654704 (438.3608856201172MB)
14.382639527320862% used
39090 interned Strings occupying 4328232 bytes.
BTrace:
開源的一個Java動态跟蹤工具,工作原理是根據hotspot虛拟機的hotswap技術将跟蹤的代碼動态替換帶被跟蹤的Java程式内
單來說,就是能在不改動目前程式的情況下,運作時的去監控Java程式的執行狀況,例如可以做到記憶體狀況的監控、方法調用的監控等等。
用法:
btrace:
pid : 需要跟蹤的Java程序id
-cp--classpath 用來編譯指定所需路徑,一般指btrace-client.jar
-p:port,指定btrace agent端口