JVM內存分析,除了堆內存還有哪些?

問題場景:某個應用服務器(2C4G),xms xmx配置3G,內存佔用遠遠超過3G,硬件服務器報警內存佔用經常超過95%,(內存一直佔用,可能導致java應用 crash),由於處於雙十一敏感時期,所以需要追根究底。(後xmx改爲2G,後面圖均是2G的配置)

懷疑點1:是否有內存泄漏?

1.觀察JVM回收詳情,無異常(類似於jvisualvm)

2.利用jmap下載堆內存文件,使用MAT、jprofile分析,並未發現異常對象

故內存佔用跟堆內存無關,排除內存泄漏,

總結:常用內存分析工具,jvisualvm jconsole,eclipse mat,jprofile.常使用命令jmap jstack jstat

懷疑點2:是否堆外內存泄漏,因爲使用到netty,可能有操作堆外內存,未釋放

-XX:NativeMemoryTracking=[off | summary | detail]  添加系統啓動參數(此配置會影響線上性能10%-15%,謹慎使用,只設置一臺機器)

jcmd命令具體自己搜一下。

本次使用的到的  jcmd 56289 VM.native_memory  …… baseline   summary.diff來追蹤內存變化,如下圖

終於看到了內存的分佈,

其中reserved表示應用可用的內存大小,committed表示應用正在使用的內存大小
Java Heap部分表示heap內存目前佔用了2048M 同xmx配置;

Class部分表示已經加載的classes個數爲15392,佔用了163MB;

Thread部分表示目前有532個線程,佔用了534MB  xss設置1M;

Code部分表示JIT生成的或者緩存的佔用了117MB;

GC部分表示目前已經佔用了136MB的內存空間用於幫助GC;

compiler部分表示compiler生成code的時候佔用了2MB;

Internal部分表示命令行解析、JVMTI等佔用了131MB;

Symbol部分表示諸如string table及constant pool等symbol佔用了20MB;

Native Memory Tracking部分表示該功能自身佔用了34MB;

至此,內存佔用均已分析完畢,後續優化點,

1.thread數量,xss大小(GC回收線程數量)

2.JIT部分jvm設置(後續研究一下)

還有一些內存pmap等命令的查看內存的分配情況,內存存儲內容等,有興趣可以瞭解一下。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章