当前位置: 首页 > 科技观察

简单易用的JVM调优内存分析工具

时间:2023-03-17 22:29:29 科技观察

对于电商、物联网、金融、社交等高并发访问的系统,JVM内存优化对于提高系统吞吐量和性能是非常必要的。通常首选的调优方式是减少FGC的次数或FGC的时间,以避免过多的系统停顿。FGC达到理想值后,例如一天或两天触发一次FGC。FCT时间优化到100-300毫秒后,再减少YoungGC次数或YoungGC时间,YoungGC仍然会消耗CPU资源。优化YoungGC的调用次数和消耗的CPU资源可以提高系统的吞吐量。在优化GC之前,您必须了解GC的实际使用情况。最好的方式是通过CGLog收集垃圾回收日志,通过一些可视化工具,比如GCEasy查看垃圾回收分析数据。不断优化,对比优化前后的GC日志,可以确认吞吐量和性能是否有提升。下面推荐几个常用的内存分析命令和工具jstat命令JDK自带的jstat命令用于查看虚拟机的垃圾回收情况。以下命令使用gcutil参数输出堆内存使用统计信息:jstat–gcutil-h20pid1000100该命令显示进程内存使用情况汇总为pid,每1000毫秒输出一次,一共输出100线。-h20表示每20行输出表头。-gcutil表示显示JVM内存使用的汇总统计:该列表显示了每一代虚拟机的使用情况,描述了堆内存的使用比例,垃圾回收的次数,以及占用的时间。具体含义如下:S0,第一个幸存者区域使用率。S1,第二个幸存者区域的使用率。E,Eden区域的使用率。哦,老一代。M,方法区,元空间使用。CCS,用于压缩的比率。YGC,年轻代垃圾回收次数。YGCT,youngbelt垃圾回收需要时间。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.hprofpid需要注意的是实际系统会有2GB到8GB的内存,这个命令会导致虚拟机暂停工作1到3秒。还有一种被动获取方法。当虚拟机内存溢出时,它会主动“转储”内存文件。添加虚拟机启动参数:-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/tmp/heapdump.hprof当虚拟机判断达到内存溢出触发条件时,会输出如下输出,并保存镜像文件:java.lang.OutOfMemoryError:JavaheapspaceDumpingheaptoheapdump.hprof...得到镜像文件后,打开JvisualVM工具,选择菜单“File”,点击Load,选择我们保存的dump文件,然后面板将打开内存图像文件。大内存镜像文件打开时间较长,需要耐心等待。其他工具,比如MAT,或者商用的YourKitJavaProfiler,打开图像文件的速度更快,分析功能也更强大。GCeasyGCeasy是一个用于分析GC日志文件的在线网站。可以根据上传的GC日志,以图表的形式展示GC的回收过程和统计数据。下图展示了GC性能的统计。如果吞吐量显示为99.935%,则表示只有少量CPU资源用于垃圾回收。GC时间最长为20毫秒,属于正常范围。测试JVM参数调整是否可以提高吞吐量,减少垃圾回收占用的CPU时,可以使用这个统计功能。下图统计了GC的总时间和回收的字节数,同时也展示了FullGC的统计信息。JMCJavaMissionControl,简称JMC,是JDK自带的一个工具。它是一个用于对象监控、管理、生成时间分析和诊断的高性能工具套件。作者主要用它来跟踪热点代码和热点线程。它是主要的内存优化和调优工具。与JVisualVM类似,通过JMX连接进入JMC控制台。连接到远程JVM进程后,就可以执行飞行记录(FlightRecord)了,只需选择飞行记录的存放路径和执行时间即可,如下图。需要注意的是飞行记录功能的执行会对当前的JVM进程有一定的性能影响(大约5%到10%),所以建议JMC在隔离环境下连接服务器执行飞行录音功能。通过一段时间的记录,飞行记录可以反映线程的繁忙程度和CPU的热点方式。使用热点方法可以直接找到最耗时的方法,重点优化热点方法可以大幅降低CPU占用率。飞行记录还可以反映内存增长的热点方式,以及单位时间内创建对象最多的方式。下图是找到的内存对象中创建最多char[]的方法,一个是Fastjson,一个是Kryo。总结:JMC的热点方法的统计结果可以有针对性的优化。作者对线上系统进行了优化,CPU占用率降低40%,内存GC频率降低100%以上。MATMAT是MemoryAnalyzer的缩写。是一款强大的Java堆内存分析器,可以分析亿级对象的内存映像,快速计算对象大小,自动发现疑似泄漏对象并生成内存泄漏报告。MAT是基于Eclipse开发的。是一款免费的内存镜像分析工具,是笔者查找内存泄漏原因的主要工具。可以通过File-OpenHeapDump打开内存镜像文件,显示内容如下图所示。它提供了一个LeakSuspects报告,输出可能存在内存泄漏的对象。OQLOQL语句类似于SQL语句,可以在VisualVM、MAT等大多数内存图像分析工具中执行,完成对象搜索任务。对于程序员和架构师来说,Java系统的性能优化是一项非凡的挑战。这是因为Java语言、Java运行平台、Java生态系统的复杂性决定了Java系统的性能优化不再是简单的升级配置或者简单的“空间换时间”技术实现,涉及到各种知识Java的要点,比如编写高性能的Java代码,Java代码的编译优化,运行时的JIT优化,JVM的内存管理优化等等,还包括如何使用高性能的第三方开源工具,以及作为需要注意性能问题的微服务和分布式系统设计。