JMAP、jstat命令輸出結果說明

顯示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 -port 7000 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=10 -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX
:CMSMaxAbortablePrecleanTime=5000 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80


發佈了0 篇原創文章 · 獲贊 1 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章