jmap分析堆記憶體飆升頻繁fullgc
處理問題:
1、對記憶體使用異常和頻繁fullgc
jmap用於列印共享物件的記憶體對映或堆記憶體的詳細資訊
語法格式如下:
[option]
[option] executable
[option] [[email protected]]remote-hostname-or-ip
1、使用jmap -heap pid檢視程序堆記憶體使用情況
jmap -heap {pid}
2、使用jmap -histo[:live] pid 檢視堆記憶體中的物件數目、大小統計直方圖,如果帶上live則只統計活物件。
jmap -histo:live {pid}
num #instances ytes class name
1: 38445 5597736
2: 38445 5237288
3: 3500 3749504
4: 60858 3242600
5: 3500 2715264
6: 2796 2131424
7: 5543 1317400 [I
8: 13714 1010768 [C
9: 4752 1003344 [B
class name是物件型別,說明如下:
B
C
D double
F float
I
J
Z boolean
[ 陣列,如[I表示[]
[L+類名 其他物件
3、檢視gc情況jstat -gc {pid}
語法格式如下:
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
vmid是Java虛擬機器ID,在Linux/Unix系統上一般就是程序ID。interval是取樣時間間隔。count是取樣數目。
比如 jstat -gc {pid} 輸出的是GC資訊,取樣時間間隔為250ms,取樣數為4:
2、dump 堆記憶體(要慎用,容易造成jvm程序掛起,建議尋找其中一臺摘掉的節點。)
jmap -dump:format=b,file=/tmp/file.dump {pid}
dump出來的檔案可以用jhat、MAT、VisualVM等工具檢視。
3、分析檢視
jhat -port 8888 /tmp/file.dump
然後就可以在瀏覽器中輸入主機地址:8888查看了.(注意如果Dump檔案太大,需要加上-J-Xmx引數指定最大堆記憶體 jhat -J-Xmx512m -port 8888 /tmp/file.dump )
找到具體是那些物件過多導致。
另:Java程序突然不服務可有可能是因為OOM導致,程序被作業系統殺死。
dmesg |grep -E ‘kill|oom|out of memory’ 來搜尋記憶體溢位的資訊挺實用。