經過JDK自帶的命令解決程序運行緩慢,tomcat內存泄露問題(待續)

講解幾個JDK自帶命令的用法(順序從使用頻率由高到低): html

1. jstat

此命令是用來查看tomcat的運行狀況的 java

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]


參數 說明
Options
選項,咱們通常使用 -gcutil 查看GC狀況
vmid
VM的進程號,即當前運行的java進程號
interval
間隔時間,單位爲秒或者毫秒
count
打印次數,若是缺省則打印無數次

S0  — Heap上的 Survivor space 0 區已使用空間的百分比
S1  — Heap上的 Survivor space 1 區已使用空間的百分比
E   — Heap上的 Eden space 區已使用空間的百分比
O   — Heap上的 Old space 區已使用空間的百分比
P   — Perm space 區已使用空間的百分比
YGC — 從應用程序啓動到採樣時發生 Young GC 的次數
YGCT– 從應用程序啓動到採樣時 Young GC 所用的時間(單位秒)
FGC — 從應用程序啓動到採樣時發生 Full GC 的次數
FGCT– 從應用程序啓動到採樣時 Full GC 所用的時間(單位秒)
GCT — 從應用程序啓動到採樣時用於垃圾回收的總時間(單位秒) linux

簡單瞭解JDK的GC運行原理後,會對以上參數更加理解。 shell

通常,咱們只須要看Old space的百分比,若是這個數值異常偏高那就須要好好檢查一下啦。 tomcat


2. jstack

使用該命令能夠在控制檯直接打印出堆棧信息 app

jstack -F [-m] [-l] <pid>
參數 說明
-F 強制輸出堆棧信息(使用jstack <pid>命令沒有獲得響應的時候使用 )
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks

這個命令還能夠輸出爲文件,以下: eclipse

jstack 22899 > /home/appuser/stacklogs/22899.log
結合jstack和top這兩個命令能夠找到當前佔用CPU或內存最高的線程堆棧信息,具體作法下面會講。


3. jmap

打印或輸出指定java進程的堆信息 jvm

jmap [option] <pid>
參數 說明
-heap 在控制檯打印出java堆的信息,包括配置的內存大小和運行狀況
-histo[:live] 
模擬柱狀圖的方式打印堆裏的對象信息,包括個數和佔用的內存.加上":live"則只打印存活的對象
-dump:<dump-options>

將堆信息以二進制文件dump下來。 工具

dump-options包含如下三個參數: 性能

live  只打印存活的對象

format=b 二進制轉換

file=<file> dump文件的路徑

eg:  jmap -dump:live,format=b,file=heap.map <pid>

-F 在使用參數dump或histo後進程沒有響應的狀況下強制生成堆信息


jmap -dump:live,file=d://7212.map 7212

我通常使用這個命令生成jmap文件,而後使用eclipse的MemoryAnalyzer工具做分析

jmap命令的CPU消耗很大,建議你們熟練後再去生產環境使用.




=====================2016年3月10日 這是分隔線唷==========================

使用jstack找出佔用CPU較高的線程

工具:   jstack , top , 能夠將十進制轉換爲十六進制的計算器(這個有點中二

1. top獲得佔用最高的進程號爲12335

2. 使用top -p 12335 -H獲得佔用CPU最高的線程號爲12358

3. 將12358由十進制轉爲十六進制獲得nid: 3046(注1),經過nid在jstack生成的堆記錄中就能查找到對應的線程啦。

不過我以爲這個方式有點中二,若是你想抓取形成瞬時對CPU佔用高的線程是根本不可能的,由於你要進行這麼多步才能找到對應的nid,可能在你找到nid的時候佔用CPU高的任務已經跑完了呢。 ╮( ̄▽ ̄")╭ 

注1: linux下,全部的java內部線程,其實都對應了一個進程id,也就是說,linux上的sun jvm將java程序中的線程映射爲了操做系統進程;咱們看到,佔用CPU資源最高的那個進程id是’15417′,這個進程id對應java線程信息中的’nid’(‘n’ stands for ‘native’);  

               --摘自《Linux下Java線程詳細監控和其dump的分析使用—-分析Java性能瓶頸》 http://www.geek521.com/?p=7649






參考博文連接: 

JDK之jstat的用法http://www.51testing.com/html/92/77492-203728.html

JVM性能調優監控工具jps、jstack、jmap、jhat、jstat、hprof使用詳解

http://my.oschina.net/feichexia/blog/196575?fromerr=RYyZOXW2

相關文章
相關標籤/搜索