天天看點

Java 應用故障排除

   對于線上使用者來說,常常因為流量過高,程式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端口

繼續閱讀