1. 程式人生 > >JVM調優(二)——Linux下監控java執行緒

JVM調優(二)——Linux下監控java執行緒

Linux環境下,當發現java程序佔用CPU資源非常高,且又要想更進一步查出哪一個java執行緒佔用了CPU資源時該如何做呢?

一、採用命令列形式檢視執行緒,最終用dump進行文字分析

1、top命令既可以看程序,又可以看執行緒 1、top命令找出佔用資源厲害的java程序id

# top

在這裡插入圖片描述 2、上圖所看到的。java的程序id為’52554’,接下來用top命令單獨對這個程序中的全部執行緒作監視

top -p 52554 -H

在這裡插入圖片描述 如上圖所看到的,linux下,全部的java內部執行緒,事實上都相應了一個程序id,也就是說,linux上的sun jvm將java程式中的執行緒對映為了作業系統程序;我們看到。佔用CPU資源最高的那個程序id是’9758’,這個程序id值對應java執行緒資訊中的’nid’(‘n’ stands for ‘native’);

2、jstack打出當前棧資訊到一個檔案中

要想找到究竟是哪段詳細的程式碼佔用瞭如此多的資源,先使用jstack打出當前棧資訊到一個檔案中, 比方stack.log:

 jstack 52554 > stack.log

3、在檔案中找到對應執行緒的位置

jtgrep 9758 stack.log

其中jtgrep是自己寫的shell指令碼

#!/bin/sh
nid=`python -c "print hex($1)"`
grep -i $nid $2

非常easy,就是把’9758’轉換成16進位制後,直接grep stack.log;能夠看到,被grep出的那個執行緒的nid=0x3c39。正好是9758的16進製表示。

或者通過(windows程式–>計算器),選擇程式猿計算器將程序ID轉換成16進位制 到dump裡面的nid 就能夠搜尋到。

"http-nio-8080-exec-25" daemon prio=10 tid=0x00007f69686b4800 nid=0x1ce5 waiting on condition [0x00007f698e7cf000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x0000000777063ec8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(Unknown Source)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
        at java.util.concurrent.LinkedBlockingQueue.take(Unknown Source)
        at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
        at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
        at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

二、通過 Java visualMv結合jconsole.exe 工具可以圖形化實時檢視執行緒資訊 在這裡插入圖片描述 其中的dump檔案也可以用專門的工具進行分析。 1、在Java Visualvm工具裡面安裝JTA外掛,分析執行緒dump檔案;