硬核:JVM性能调优,有哪些好用的内存分析神器?

对于高并发访问量的电商、物联网、金融、社交等系统来说,jvm内存优化是非常有必要的,可以提高系统的吞吐量和性能。通常调优的首选方式是减少fgc次数或者fgc时间,以避免系统过多地暂停。fgc达到理想值后,比如一天或者两天触发一次fgc。fct时间优化为100~300毫秒后,再减少younggc次数或者younggc时间,younggc仍然会消耗cpu资源,优化younggc调用次数和消耗的cpu资源,可以提高系统的吞吐量。 优化gc前,必须获取gc的实际使用情况,最好的方式是通过cg log收集垃圾回收日志,通过一些可视化工具查看垃圾回收分析数据,比如gceasy。持续优化和对比优化前后的gc log,能确认吞吐量和性能是否得到提升。
下面推荐几个常用的内存分析命令和工具
jstat命令 jdk自带的jstat命令用于查看虚拟机垃圾回收的情况,如下命令使用gcutil参数输出堆内存使用情况统计:
jstat –gcutil  -h 20 pid 1000 100 此命令显示进程为pid的内存使用汇总,1000毫秒输出一次,总共输出100行。-h 20表示每20行输出一次表头。-gcutil表示显示jvm内存使用汇总统计:
列表显示了虚拟机各个代的使用情况,描述了堆内存的使用占比和垃圾回收次数,以及占用时间,具体含义如下:
s0,第一个幸存区使用比值。 s1,第二个幸存区的使用率。 e,伊甸园区的使用比值。 o,老年代。 m,方法区、元空间使用率。 ccs,压缩使用比值。 ygc,年轻代垃圾回收次数。 ygct,年轻带垃圾回收占用时间。 fgc,全局垃圾回收次数,这对性能影响至关重要。 fgct,全局垃圾回收的消耗时间。 gct,总的垃圾回收时间。 可以看到s0、s1、e变化频率高,说明程序在频繁创建生命周期短的对象,fgc为0,表示还未做过全局垃圾回收。如果fgc变化频率很高,则说明系统性能和吞吐量将下降,或者可能出现内存溢出。
其他查看汇总信息的常用选项如下:
-gc,类似gcutil,gcutil以百分比形式显示内存的使用情况,gc显示的是内存占用的字节数,以kb的形式输出堆内存的使用情况。
-gccause,类似gcutil,额外输出gc的原因。
jmap命令 jmap命令用于保存虚拟机内存镜像到文件中,然后可以使用jvisualvm或者mat工具进行进一步分析。命令如下:
jmap -dump:format=b,file=filename.hprof pid 需要注意,实际系统会有2gb到8gb内存,此命令会导致虚拟机暂停工作1~3秒。还有一种是被动获取方式,当虚拟机出现内存溢出的时候,会主动“dump”内存文件。添加虚拟机启动参数:
-xx:+heapdumponoutofmemoryerror -xx:heapdumppath=/tmp/heapdump.hprof 当虚拟机判断达到内存溢出触发条件的时候,会有如下输出并保存镜像文件:
java.lang.outofmemoryerror: java heap spacedumping heap to heapdump.hprof ... 当获得镜像文件后,打开jvisualvm工具,选择菜单“file”,点击装入,选择我们保存过的dump文件,这时面板会打开内存镜像文件。打开较大的内存镜像文件需要较长的时间,需要耐心等候,其他工具,如mat,或者商业的yourkit java profiler打开镜像文件更快,分析功能更强大。
gceasy gceasy是一个分析gc日志文件的在线网站,能根据上传的gc日志,以图表形式显示gc回收过程和统计数据。下图显示的是gc性能的统计情况,如吞吐量显示为99.935%,说明只有少量cpu资源用于垃圾回收。最长的gc时间是20毫秒,属于正常范围。在测试jvm参数调整是否能增加吞吐量,减小垃圾回收占用的cpu时,可以使用这个统计功能。
下图统计了gc总的时间和回收的字节数,也显示了full gc的统计情况。
jmc java mission control简称jmc,是jdk自带的工具,是一个高性能的对象监视、管理、产生时间分析和诊断的工具套件,笔者主要用来追踪热点代码与热点线程,是主要的内存优化调优工具。
类似jvisualvm,通过jmx连接进入jmc控制台。
通过连接到远程jvm进程后,可以执行飞行记录(flightrecord),选择飞行记录存放的路径与执行时间即可,如下图所示。需要注意的是,执行飞行记录功能时会对当前jvm进程有一定的性能影响(大约为5%~10%),所以建议jmc连接隔离环境中的服务器并执行飞行记录功能。
通过一段时间的记录,飞行记录可以反映线程的繁忙程度,以及cpu的热点方法。
使用热点方法可以直接找到最耗时的几个方法,对热点方法重点优化就可以使cpu的使用率下降一大截。
飞行记录还可以反映内存增长的热点方法,以及显示单位时间内创建的最多对象的方法。下图为找到的内存对象中创建的最多的char[]的方法,一个是fastjson,另一个是kryo。
小结:通过jmc的热点方法的统计结果可以有针对性地进行优化,笔者通过对线上系统进行优化使得cpu使用率下降了40%、内存gc频率下降了100%以上。
mat mat是memory analyzer的简称,它是一款功能强大的java堆内存分析器,可以分析具有数亿个对象的内存镜像,快速计算对象大小,自动找到嫌疑的泄漏对象并形成内存泄漏报告。mat是基于eclipse开发的,是一款免费的内存镜像分析工具,是笔者发现内存泄漏原因的主要工具。
通过file-open heap dump可以打开内存镜像文件,显示内容如下图所示。
它提供了leak suspects 报告,输出有可能发生内存泄漏的对象。
oql oql语句类似sql语句,可以在visualvm、mat等大多数内存镜像分析工具中执行,完成对象查找任务。


华为AirEngine Wi-Fi 6 86面板AP推动家庭网络能力升级
怎样设计一款基于STM32F407板的智能药箱
美国能源部发布首个关于储能的综合性战略
美国专利商标局发布了一项苹果的专利申请,该专利同样涉及量子点技术
ubuntu系统使用教程
硬核:JVM性能调优,有哪些好用的内存分析神器?
无线充电器哪个牌子好,苹果无线充电器品牌排行
莱迪思推出新型FPGA:IO密度达同类的2倍
新思科技与Ansys联合开发的电压时序签核解决方案获三星采用
电动汽车电池内阻测试解决方案
用一体化整车感知交互解决方案引领车载市场,瑞声科技全力赋能汽车产业
kry将致力于远程视频医疗提供技术服务
魅族PRO 7:这是魅族今年最牛逼的手机之一
java如何实现blowfish算法
3000块内必买荣耀9的三个理由,对比小米6、OPPOR11、一加5、坚果pro优势明显!
汽车转向球头销感应热处理的改进-1
Arasan推出MIPI DSI IP
cpu新一轮涨价来临 美国加征关税包括了哪些DIY硬件
关于Vishay DG增强模拟开关IC性能分析
德州仪器发布低功耗 60GHz 毫米波雷达传感器