JMAP、jstat命令詳解

LesleeGolds 8年前發布 | 11K 次閱讀 Java開發

來自: http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=531464&id=2354636


顯示java進程內存使用的相關信息

jmap pid #打印內存使用的摘要信息

jmap –heap pid #java heap信息

jmap -histo:live pid #統計對象count ,live表示在使用

jmap -histo pid >mem.txt #打印比較簡單的各個有多少個對象占了多少內存的信息,一般重定向的文件

jmap -dump:format=b,file=mem.dat pid #將內存使用的詳細情況輸出到mem.dat 文件

 

用jhat命令可以參看 jhat  -J-Xmx512m mem.dat 

然后使用:http://127.0.0.1:7000/ 查看類相關信息 

 

各個className 

BaseType Character Type Interpretation

B byte signed byte

C char Unicode character

D double double-precision floating-point value

F float single-precision floating-point value

I int integer

J long long integer

L<classname>; reference an instance of class <classname>

S short signed short

Z boolean true or false

[ reference

one array dimension

 

內存泄漏一般都是有一定特征的,任何代碼和數據都要占用內存,我簡單總結內存泄漏的特征是內存占用不可控制,GC不可回收。我追蹤內存使用量的曲線發現一些特征,在估計虛擬機即將崩潰時,使用

jmap -histo pid >mem.txt 發現相關內存泄漏的對象占用非常大比例的內存空間,然后很容易猜測問題大概的位置,一下子就解決了。

 

 

 Jstat是Sun JDK中自帶的監控工具,利用了JVM內建的指令對Java應用程序的資源和性能進行實時的命令行的監控,包括了對Heap size和垃圾回收狀況的監控等等。JStat是命令行方式運行,對系統資源占用很小,在大壓力下很少影響性能。并且運行要求低,只要通過Telnet或SSH等方式遠程登錄到服務器所在機器,就可以進行監控。在與Jmap、JStack等工具結合使用時非常方便。

使用jstat命令監測如下內存使用和垃圾回收統計數據: 

$ <JDK>/bin/jstat –gcutil [-h<lines>] <pid> <interval>

jstat - gcutil選項打印所運行應用程序進程ID <pid>在指定抽樣間隔<interval>下,堆使用及垃圾回收時間摘要,并且每<lines>行顯示一次頭信息。這產生出以下樣例輸出:

S0 S1 E O P YGC YGCT FGC FGCT GCT

0.00 0.00 24.48 46.60 90.24 142 0.530 104 28.739 29.269

0.00 0.00 2.38 51.08 90.24 144 0.536 106 29.280 29.816

0.00 0.00 36.52 51.08 90.24 144 0.536 106 29.280 29.816

0.00 26.62 36.12 51.12 90.24 145 0.538 107 29.552 30.090

一些術語的中文解釋:

S0C:年輕代中第一個survivor(幸存區)的容量 (字節)

S1C:年輕代中第二個survivor(幸存區)的容量 (字節)

S0U:年輕代中第一個survivor(幸存區)目前已使用空間 (字節)

S1U:年輕代中第二個survivor(幸存區)目前已使用空間 (字節)

EC:年輕代中Eden(伊甸園)的容量 (字節)

EU:年輕代中Eden(伊甸園)目前已使用空間 (字節)

OC:Old代的容量 (字節)

OU:Old代目前已使用空間 (字節)

PC:Perm(持久代)的容量 (字節)

PU:Perm(持久代)目前已使用空間 (字節)

YGC:從應用程序啟動到采樣時年輕代中gc次數

YGCT:從應用程序啟動到采樣時年輕代中gc所用時間(s)

FGC:從應用程序啟動到采樣時old代(全gc)gc次數

FGCT:從應用程序啟動到采樣時old代(全gc)gc所用時間(s)

GCT:從應用程序啟動到采樣時gc用的總時間(s)

NGCMN:年輕代(young)中初始化(最小)的大小 (字節)

NGCMX:年輕代(young)的最大容量 (字節)

NGC:年輕代(young)中當前的容量 (字節)

OGCMN:old代中初始化(最小)的大小 (字節)

OGCMX:old代的最大容量 (字節)

OGC:old代當前新生成的容量 (字節)

PGCMN:perm代中初始化(最小)的大小 (字節)

PGCMX:perm代的最大容量 (字節)

PGC:perm代當前新生成的容量 (字節)

S0:年輕代中第一個survivor(幸存區)已使用的占當前容量百分比

S1:年輕代中第二個survivor(幸存區)已使用的占當前容量百分比

E:年輕代中Eden(伊甸園)已使用的占當前容量百分比

O:old代已使用的占當前容量百分比

P:perm代已使用的占當前容量百分比

S0CMX:年輕代中第一個survivor(幸存區)的最大容量 (字節)

S1CMX :年輕代中第二個survivor(幸存區)的最大容量 (字節)

ECMX:年輕代中Eden(伊甸園)的最大容量 (字節)

DSS:當前需要survivor(幸存區)的容量 (字節)(Eden區已滿)

TT: 持有次數限制

MTT : 最大持有次數限制

如果FGC 過多,有必要調整下jvm參數

[root@yy8 bin]# jstat -gcutil 3821 5000  10

  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   

  0.00   0.00 100.00  95.11  59.02    370   48.495   121  337.359  385.855

  0.00   0.00  84.36  99.99  59.03    370   48.495   122  345.393  393.888

  0.00  50.37 100.00  99.49  59.03    370   48.495   123  348.494  396.989

  0.00 100.00 100.00  56.58  59.03    371   48.496   124  348.494  396.989

  0.00   0.00  56.50  96.57  59.02    371   48.496   125  355.148  403.643

  0.00   0.00 100.00  96.57  59.02    372   48.496   126  355.148  403.643

  0.00   0.00  37.17  90.75  59.02    372   48.496   127  361.721  410.217

  0.00   0.00 100.00  90.75  59.02    373   48.496   128  361.721  410.217

5000 是5秒 ,10是10次

參考范例

JAVA_OPTS="-server -Xms4g -Xmx4g -XX:PermSize=96m -XX:MaxPermSize=256m -Xmn2560m -XX:SurvivorRatio=3 -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:

CMSMaxAbortablePrecleanTime=5000 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+DisableExplicitGC -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=10000 -Dsun.net.client.defaultReadTimeout=30000"

 

 

 本文由用戶 LesleeGolds 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!