当前位置:首页 > 文章 > 正文内容

JDK中自带的JVM分析工具

廖万里3年前 (2022-10-27)文章37870


内存溢出,妥妥的名场面;

一、业务背景

对于分布式架构中的文件服务来说,由于涉及大量的IO流操作,很容易引发JVM的相关异常,尤其是内存溢出的问题;

JDK中自带的JVM分析工具

在最近的一次版本迭代中,真实的业务处理场景和上述几乎一致,由于在文件服务中添加批量处理的动作,直接唤醒了隐藏许久的BUG,就是最常见的内存溢出;

问题的起因:在word文档完成内容识别后,转换为pdf文件,然后进行页面分割转为一组图片,在这个复杂并且超长的流程中存在一个数组容器未销毁;

解决的方式:分析JVM的dump文件,定位OOM问题引发的根本原因,结合文件服务的异常日志分析,添加资源的释放动作,从而解决问题;

二、Jdk-Bin目录

对于相当一部分新手来说,看到JVM的问题都是Bug不知所起一脸懵的,其实这种心态大可不必,从职场几年的开发经验上看,JVM的问题大致分为两种:

  • 开发轻松解决:可以升级内存资源或者调整分配,又或者对程序优化,完成相关资源的管理和释放,这是最常用的手段;

  • 轻松解决开发:由于经验不足,程序出现重大BUG导致JVM异常,进而引起系列的连锁反应,这种不会绝地反弹,只有一地鸡毛;

在解决常规的JVM异常时,通常依赖JDK中基础工具即可完成问题的定位,从而进行分析和解决,不过这些需要对基础工具熟练使用才行,而很多JDK自身的能力又是经常被忽略的;

在jdk的bin目录中,有很多自带工具可以用于对JVM的分析;

JDK中自带的JVM分析工具

上述是基于jdk1.8的目录,里面有很多开发经常用到命令,下面围绕一个微服务的启动和运行,来看看基于JDK中自带JVM工具的用法;

三、命令行工具

1、jps命令

jps:虚拟机进程状态工具,该命令在Java环境部署和服务启动查看时经常用到,首先在本地启动一个facade门面微服务,然后在命令行中执行查询;

  • jps:命令默认输出的是进程ID和应用主类的名称;

  • -l:输出进程ID和应用主类的完整路径;

  • -v:输出向jvm传递的参数,此处展示为idea中显式配置的VM-options参数,其他内容自行查看即可;

  • -m:输出向main方法传递的参数,服务启动前可以在idea的Program-arguments配置;

$ jps1281 FacadeApp$ jps -l1281 com.explore.facade.FacadeApp$ jps -v1281 FacadeApp -Xms128m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m$ jps -m1281 FacadeApp hello,main-method

2、jinfo命令

jinfo:在命令后面带pid进程号,可以输出指定进程的配置信息,在应用启动时通常不会指定过多的配置参数,就可以使用该命令查询很多参数的默认值;该命令还可以在运行时动态调整部分参数,只是很少被使用;

$ jinfo 1281            # 只粘贴个别参数Java System Properties: # 系统参数
    java.runtime.version=1.8.0_144-b01
    file.encoding=UTF-8
    sun.java.command=com.explore.facade.FacadeApp hello,main-method
    VM Flags:               # 虚拟机参数
    -XX:InitialHeapSize=134217728 -XX:MaxHeapSize=268435456 -XX:MaxNewSize=267911168
    VM Arguments:           # 运行时参数
    jvm_args: -Xms128m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
    java_command: com.explore.facade.FacadeApp hello,main-method$ jinfo -sysprops 1281  # 只输出【Java System Properties】参数$ jinfo -flags 1281     # 只输出【VM Flags】参数

3、jstat命令

jstat:以指定的频率输出JVM的监控指标,下述命令输出内存占用和GC相关信息,每隔3秒输出一次,连续打印5次;由于这里只是启动一个简单的微服务,没有执行业务逻辑,所以各项指标比较平稳;

$ jstat -gcutil 1281 3000 5S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT   
0.00   0.00  57.97  64.16  92.82  88.75    3    0.028     9    0.516     -        -    0.5440.00   0.00  57.97  64.16  92.82  88.75    3    0.028     9    0.516     -        -    0.544

该命令是比较常用的,这里各项指标的统计逻辑,在tools.jar包中有jstat_options参考文档,相对路径sun/tools/jstat/resources/目录下;

option gcutil {
  column {
    header "^S0^"	/* Survivor 0 Space - Percent Used */
    data (1-((sun.gc.generation.0.space.1.capacity - sun.gc.generation.0.space.1.used)/sun.gc.generation.0.space.1.capacity)) * 100
  }
  column {
    header "^S1^"	/* Survivor 1 Space - Percent Used */
    data (1-((sun.gc.generation.0.space.2.capacity - sun.gc.generation.0.space.2.used)/sun.gc.generation.0.space.2.capacity)) * 100
  }
  ......
}

4、jstack命令

jstack:输出指定进程当前时刻在JVM中的线程信息,为了清楚的展示其效果,在服务启动时创建线程死锁,然后通过该命令就会把发生死锁的线程打印出来,通过输出可以发现两条互相等待的线程信息;

$ jstack 1281Found one Java-level deadlock:
============================="test-thread-02":  waiting for ownable synchronizer 0x00000007b00a35d0, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),  which is held by "test-thread-01""test-thread-01":  waiting for ownable synchronizer 0x00000007b00a35a0, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),  which is held by "test-thread-02"Java stack information for the threads listed above:
==================================================="test-thread-02":    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000007b00a35d0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)"test-thread-01":    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000007b00a35a0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)Found 1 deadlock.

5、jmap命令

jmap:可以输出指定进程的内存中对象映射信息,或者堆的关键信息、内存的使用统计、GC算法、配置、类的实例信息及内存占用等,该命令在解决JVM问题时也经常使用;

$ jmap 1281$ jmap -heap 1281Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 536870912 (512.0MB)
   Heap Usage:
    PS Young Generation
    Eden Space:
    From Space:
    To Space:
    PS Old Generation$ jmap -histo:live 1281
 num     #instances         #bytes  class name----------------------------------------------1311:             1             32  com.explore.facade.FacadeApp$$EnhancerBySpringCGLIB$$313d9e3

四、可视化工具

1、jconsole

Java内置的JVM性能监控工具,在熟悉上述的命令行工具之后,对于该可视化工具的使用不会太陌生,在命令中可以查看到的默认参数或者应用自定义配置,在该工具中也可以找到,并且以图形化的方式呈现;

$ jconsole  # 通过该命令会唤起jconsole界面

JDK中自带的JVM分析工具

这里选择线程一栏,可以直观的看到线程数量的变化曲线,也可以在下方查看某个线程的具体信息,并且可以通过检测死锁功能,发现在服务中创建的test-thread-01和test-thread-02两条线程;

JDK中自带的JVM分析工具

2、visualvm

VisualVM作为解决JVM问题的常用工具,集成的功能丰富且强大,此处通过Idea插件的方式启动FacadeApp微服务,在进程主页可以看到自定义的配置,线程一栏因为检测到死锁直接给到异常提示;

JDK中自带的JVM分析工具

在监视一栏可以通过【堆dump】查看详细的信息,可以查看类的实例数和大小,并且完成了结果排序和占用统计;此处信息在定位和解决JVM问题时非常重要;

JDK中自带的JVM分析工具

对于JVM的监控工具来说,其能力与常用的命令行语法差异很小,并且这些命令在jdk中tools.jar包也可以找到其对应的类,对于一些更高级的监控平台来说,例如Kuboard、Skywalking等,也对这些底层能力做了集成,其原理应该也是大同小异。

五、参考源码

编程文档:
https://gitee.com/cicadasmile/butte-java-note

应用仓库:
https://gitee.com/cicadasmile/butte-flyer-parent


本文链接:https://www.kkkliao.cn/?id=161 转载需授权!

分享到:

版权声明:本文由廖万里的博客发布,如需转载请注明出处。


“JDK中自带的JVM分析工具” 的相关文章

日本拆无人机后曝光:核心芯片来自美国,大疆会走上华为的老路吗?

日本拆无人机后曝光:核心芯片来自美国,大疆会走上华为的老路吗?

大疆无人机在日被拆解,确认核心部件源自美国?在无人机领域盛传一句话:“世界无人机只分为两类,大疆和其他‘玩具机’”。因此,作为入选了胡润全球独角兽企业的大疆无人机公司,一直是美国、日本等多个国家高精尖企业眼中的“香饽饽”。他们试图攻克大疆的操作原理,更致力于找到突破中国无人机第一的弱点。2020年大...

英国“最富首相”苏纳克如何一路开挂?

英国“最富首相”苏纳克如何一路开挂?

当地时间10月24日下午两点,是英国保守党在下议院党团1922委员会设定的提交新任保守党党首选举提名的截止时间。在成功获得了197名保守党议员提名,且两位对手约翰逊和莫当特先后宣布退选后,前任财政大臣里希·苏纳克成为唯一符合“入闸”条件的党首候选人,按程序自动当选。随后,苏纳克在保守党中央党部发表了...

开始“反扑”了?中国院士正式宣布,厉害的不只有华为

开始“反扑”了?中国院士正式宣布,厉害的不只有华为

随着中国的这些年的不断发展,中国在各方都取得了很大的成就,现在的中国已经发生了翻天覆地的变化。在生活上。我们进入了电商时代,进入了移动支付时代;在科技上,我们进入了智能互联网时代,即将迎来的是全新的5G时代,还有很多很多中国制造都是值得我们骄傲的。特别值得提及的就是,现在中国制造已经成为了我们的一个...

失窃iPhone最终归宿:一台被盗的手机,如何在华强北“焕发新生”

失窃iPhone最终归宿:一台被盗的手机,如何在华强北“焕发新生”

华强北,一个中国数码史上现象级的名词。这条中轴主干道南北长900多米的街区,造就了中国电子科技历史上的神话。但一个硬币有两面,如果说腾讯、TP-Link这样的成功企业代表了华强北向阳的一面,那么华强北的阴暗一面,就离不开两个词:组装机和山寨机。如今,在各大手机厂商物美价廉的新品联合绞杀之下,山寨机已...

六零后已经渐渐老了,都是独生子女家庭,以后怎样养老?

六零后已经渐渐老了,都是独生子女家庭,以后怎样养老?

我是68年的,今年54岁,我也只有一个女儿,以后怎么养老的问题,我在十年前就开始准备了,所以我的养老问题我现在一点都不担心,因为我早已经准备好了。我从上班到退休一直在银行储蓄柜工作。工作小柜台,人生大舞台,在几十年的工作中我见识了形形色色的人,也见过很多老人特别是没有退休金的老人晚年凄苦的生活。所以...

小米12SPro深度体验评测,什么叫“水 桶 旗 舰”啊?

小米12SPro深度体验评测,什么叫“水 桶 旗 舰”啊?

首先,依然是祖传一句话评价:补齐了唯一短板的水桶旗舰。其实就像年初的时候评价小米12Pro一样,今年的12系列看得出小米是在努力的优化体验,而不是单纯的堆叠参数,所以更注重手感的12和12S,以及徕卡加持下算法提升、影调有明显改善的小米12S Ultra便应运而生,至于今年的12Pro和12S Pr...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。