0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Android编程精选 来源:Android编程精选 2023-02-11 10:58 次阅读
对于高并发访问量的电商、物联网、金融、社交等系统来说,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-h20pid1000100

此命令显示进程为pid的内存使用汇总,1000毫秒输出一次,总共输出100行。-h 20表示每20行输出一次表头。-gcutil表示显示JVM内存使用汇总统计:

bbbe497e-a9b1-11ed-bfe3-dac502259ad0.png

列表显示了虚拟机各个代的使用情况,描述了堆内存的使用占比和垃圾回收次数,以及占用时间,具体含义如下:

  • 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.hprofpid

需要注意,实际系统会有2GB到8GB内存,此命令会导致虚拟机暂停工作1~3秒。还有一种是被动获取方式,当虚拟机出现内存溢出的时候,会主动“dump”内存文件。添加虚拟机启动参数:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heapdump.hprof

当虚拟机判断达到内存溢出触发条件的时候,会有如下输出并保存镜像文件:

java.lang.OutOfMemoryError:Javaheapspace
Dumpingheaptoheapdump.hprof...

当获得镜像文件后,打开JvisualVM工具,选择菜单“File”,点击装入,选择我们保存过的dump文件,这时面板会打开内存镜像文件。打开较大的内存镜像文件需要较长的时间,需要耐心等候,其他工具,如MAT,或者商业的YourKit Java Profiler打开镜像文件更快,分析功能更强大。

GCeasy

GCeasy是一个分析GC日志文件的在线网站,能根据上传的GC日志,以图表形式显示GC回收过程和统计数据。下图显示的是GC性能的统计情况,如吞吐量显示为99.935%,说明只有少量CPU资源用于垃圾回收。最长的GC时间是20毫秒,属于正常范围。在测试JVM参数调整是否能增加吞吐量,减小垃圾回收占用的CPU时,可以使用这个统计功能。

bbd2ed8e-a9b1-11ed-bfe3-dac502259ad0.png

下图统计了GC总的时间和回收的字节数,也显示了Full GC的统计情况。

bbee2964-a9b1-11ed-bfe3-dac502259ad0.png

JMC

Java Mission Control简称JMC,是JDK自带的工具,是一个高性能的对象监视、管理、产生时间分析和诊断的工具套件,笔者主要用来追踪热点代码与热点线程,是主要的内存优化调优工具。

类似JVisualVM,通过JMX连接进入JMC控制台。

通过连接到远程JVM进程后,可以执行飞行记录(FlightRecord),选择飞行记录存放的路径与执行时间即可,如下图所示。需要注意的是,执行飞行记录功能时会对当前JVM进程有一定的性能影响(大约为5%~10%),所以建议JMC连接隔离环境中的服务器并执行飞行记录功能。

bbffff68-a9b1-11ed-bfe3-dac502259ad0.png

通过一段时间的记录,飞行记录可以反映线程的繁忙程度,以及CPU的热点方法。

使用热点方法可以直接找到最耗时的几个方法,对热点方法重点优化就可以使CPU的使用率下降一大截。

飞行记录还可以反映内存增长的热点方法,以及显示单位时间内创建的最多对象的方法。下图为找到的内存对象中创建的最多的char[]的方法,一个是Fastjson,另一个是Kryo。

bc1481b8-a9b1-11ed-bfe3-dac502259ad0.png

小结:通过JMC的热点方法的统计结果可以有针对性地进行优化,笔者通过对线上系统进行优化使得CPU使用率下降了40%、内存GC频率下降了100%以上。

MAT

MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器,可以分析具有数亿个对象的内存镜像,快速计算对象大小,自动找到嫌疑的泄漏对象并形成内存泄漏报告。MAT是基于Eclipse开发的,是一款免费的内存镜像分析工具,是笔者发现内存泄漏原因的主要工具。

通过File-Open Heap Dump可以打开内存镜像文件,显示内容如下图所示。

bc3a91f0-a9b1-11ed-bfe3-dac502259ad0.png

它提供了Leak Suspects 报告,输出有可能发生内存泄漏的对象。

OQL

OQL语句类似SQL语句,可以在VisualVM、MAT等大多数内存镜像分析工具中执行,完成对象查找任务。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    3034

    浏览量

    74135
  • SQL
    SQL
    +关注

    关注

    1

    文章

    767

    浏览量

    44174
  • JVM
    JVM
    +关注

    关注

    0

    文章

    158

    浏览量

    12238

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

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    java开发人员不了解jvm对工作有影响吗

    作为一名java开发人员,不了解jvm对工作什么影响?
    发表于 04-10 11:57

    JVM性能指标分析

    JVM性能实践——JVM
    发表于 10-17 15:00

    Jvm垃圾回收机制及性能实战

    JVM中自动检测并移除不再使用的数据对象的这种机制称为:垃圾回收,简称GC。JVM通过使用垃圾收集器及使用相应的垃圾回收算法将内存中不再被使用的对象进行回收。由于不同JAVA对象存活时间是不一样
    发表于 04-03 14:31 2次下载

    关于JVM知识

    最近很多小伙伴跟我说,自己学了不少JVM知识,但是在实际工作中却不知道何时对JVM进行
    的头像 发表于 09-14 14:54 843次阅读

    Alluxio线程池结构与吞吐量

    本文介绍了 Alluxio Master 的线程池结构与每个线程的功能。在过程中,利用分析结果调整审计日志的 blocking queue,调整 UFS-SYNC-PREFETCH 线程数,
    发表于 11-11 11:36 611次阅读

    jvm内存分析命令和工具

    JVM内存分析是Java开发和过程中非常重要的一部分。通过对JVM
    的头像 发表于 12-05 11:07 1211次阅读

    javajvm几种方法

    基本概念。JVM(Java Virtual Machine,Java虚拟机)是Java运行时环境的核心组件,负责解释和执行Java字节码文件。JVM的目标是优化
    的头像 发表于 12-05 11:11 2130次阅读

    什么场景需要jvm

    JVM是指对Java虚拟机进行性能优化和资源管理,以提高应用程序的运行效率和吞吐量。JVM
    的头像 发表于 12-05 11:14 1450次阅读

    jvm参数

    JVM(Java虚拟机)是Java程序的运行环境,它负责解释Java字节码并执行相应的指令。为了提高应用程序的性能和稳定性,我们可以JVM
    的头像 发表于 12-05 11:29 653次阅读

    jvm参数的设置和jvm

    JVM(Java虚拟机)参数的设置和对于提高Java应用程序的性能和稳定性非常重要。在本文中,我们将详细介绍JVM参数的设置和
    的头像 发表于 12-05 11:36 1587次阅读

    jvm主要是哪里

    JVM主要涉及内存管理、垃圾回收、线程管理与锁优化等方面。下面将详细介绍每个方面的技术和
    的头像 发表于 12-05 11:37 1574次阅读

    jvm常用命令

    JVM是提升Java应用性能的一个重要方面,通过合理设置JVM参数可以达到优化应用性能、提高
    的头像 发表于 12-05 11:43 706次阅读

    jvm工具有哪些

    JVM是提高Java应用程序性能的重要手段,而JVM
    的头像 发表于 12-05 11:44 1094次阅读

    鸿蒙开发实战:【性能组件】

    性能组件包含系统和应用框架,旨在为开发者提供一套性能
    的头像 发表于 03-13 15:12 465次阅读
    鸿蒙开发实战:【<b class='flag-5'>性能</b><b class='flag-5'>调</b><b class='flag-5'>优</b>组件】

    深度解析JVM实践应用

    Tomcat自身的是针对conf/server.xml中的几个参数的设置。首先是对这几个参数的含义要有深刻而清楚的理解。
    的头像 发表于 04-01 10:24 488次阅读
    深度解析<b class='flag-5'>JVM</b><b class='flag-5'>调</b><b class='flag-5'>优</b>实践应用