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等命令的查看内存的分配情况,内存存储内容等,有兴趣可以了解一下。