問題場景:某個應用服務器(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等命令的查看內存的分配情況,內存存儲內容等,有興趣可以瞭解一下。