Redian新闻
>
JVM调优几款好用的内存分析工具

JVM调优几款好用的内存分析工具

公众号新闻

你好,我是yes。

对于高并发访问量的电商、物联网、金融、社交等系统来说,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等大多数内存镜像分析工具中执行,完成对象查找任务。



对于程序员和架构师来说,Java系统的性能优化是一个超常规的挑战。

推荐一本新书:

《高性能Java系统权威指南》一书从高性能、易维护、代码增强,以及在微服务系统中编写Java代码的角度来描述如何实现高性能Java系统。书中的大部分例子都是作者从事Java开发20年来,在头部IT企业的高并发系统中摘录而来的,极具参考意义。如果你想要学习如何用Java设计出高性能、高并发、高可用的系统,那么这本书绝对值得一看!现在京东半价促销,感兴趣的同学可以点击下方卡片购买阅读。

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
寅冬玫瑰樱盛开变态封控结束了,余波还在从JVM虚拟机到多线程,手撸Java开发面试必备技术栈 | 极客时间一次JVM GC长暂停的排查过程提醒!夏令时没取消!本周日2AM调夏令时!少睡一小时!读《诗》:读 《柏舟》除了GhatGPT,还有哪些好用的AI小工具?谷歌:使用 Rust 后,安卓系统的内存安全漏洞数量大幅下降别用 VMware 了,这款虚拟机简单、轻量、好用还免费...MySQL 5.7 并行复制实现原理与调优提醒!改时间没取消!本周日2AM调夏令时!少睡一小时!友情提醒!又要改时间了!本周日2AM调夏令时!少睡一小时!万能通用的Java调优方案合集,yyds!生信和数据挖掘必备:一款超好用的基因组分析工具网站!一款好用的开源家庭服务器管理工具美团一面:为什么线程崩溃崩溃不会导致 JVM 崩溃阿里:每天100w次登陆请求, 8G 内存该如何设置JVM参数?巴拿马项目:打通 JVM 与 Native 代码彭博投资组合分析工具月报 | 揭秘彭博MAC3全球股票风险模型(1)NeurIPS 2022 | 基于激活值稀疏化的内存高效迁移学习一文读懂 Linux 内存分配策略超好用的张小泉系列!全网家用剪刀销量第一,各种实用小工具让生活简单轻松!阳光沙滩谷歌推出深度学习调优手册,不到一天狂揽1200星,Hinton转发|GitHub彭博投资组合分析工具月报 | 关于FoF管理分析,你想知道的在这里Origin做生存分析,3分钟学会!浅谈阿里开源JVM Sandbox(内含代码实战)彭博投资组合分析工具月报 | 彭博MAC3全球股票风险模型的具体应用场景爬藤成功与否和经验采集关系不大。而是在怀孕的一霎间就基本决定了。4个维度入手,分享你1份人人都可用的分析工具!|前哨大会2022分享几款免费实用的国产内网穿透工具很全哦【内存】Android C/C++ 内存泄漏分析 unreachable11款好用又开源的视频剪辑处理工具一文走进多核架构下的内存模提醒!改时间没取消,本周日2AM调夏令时,少睡一小时...
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。