顯示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