JDK自带的JVM工具

以你之姓@ 2023-02-14 05:59 344阅读 0赞

目录

      • jdk自带的jvm工具
        • jps 查看jvm进程、jvm参数
        • jstat 查看jvm的运行状态
        • jinfo 查看jvm参数
        • jstack 查看线程快照
        • jmap 查看堆的使用情况、生成堆快照
        • jhat 分析堆快照
        • jconsole jvm状态可视化查看工具
        • jvisualvm 更加强大的jvm状态可视化查看工具
      • 内存泄漏

虚拟机工具可以分析jvm运行时数据、定位jvm存在的问题。这些工具在jdk的bin目录下,前面的均只作为了解,实际只使用最后2个。

jdk自带的jvm工具

jps 查看jvm进程、jvm参数

  1. #查看正在执行的虚拟机进程,和ps -ef|grep java相似,也可以使用ps -ef | grep xxx代替
  2. #会输出pid,主类显示全限定类名,如果执行的是jar则显示jar的路径
  3. jps -l
  4. #查看jvm参数
  5. jps -v

jstat 查看jvm的运行状态

  1. #pid、间隔多少ms输出1次、输出次数。缺省输出次数时,默认一直输出
  2. jstat -gc 16340 1000 10

在这里插入图片描述

  • S0C、S1C:第一个、第二个Survivor区的容量(from、to),S是Survivor、C是Capacity
  • S0U、S1U:第一个、第二个Survivor区已使用的容量,U是used
  • EC、 EU:Eden区的容量、已用容量
  • OC、OU:老年代的容量、已用容量,O是old
  • MC、MU:方法区的
  • CCSC、CCSU:压缩的类空间的
  • YGC、YGCT:新生代垃圾回收次数、消耗时间,Y是young,GC就是gc,T是time
  • FGC、FGCT:老年代的,FGC是Full GC 老年代GC
  • GCT:垃圾回收消耗总时间

jinfo 查看jvm参数

  1. #查看指定进程(pid)的信息,包括操作系统的信息、环境变量、jvm参数等
  2. jinfo 16340
  3. #查看指定进程的全部jvm参数
  4. jinfo -flags 16340
  5. #查看指定进程的指定jvm参数,也可以通过grep过滤得到
  6. jinfo -flag MaxHeapSize 16340

jstack 查看线程快照

线程快照可以定位线程出现长时间停顿的原因,比如线程间死锁、死循环、等待获取锁等

  1. #查看线程快照,包括线程名、线程状态、执行到那个类的哪一行代码、持有的锁
  2. jstack -l 28584 #pid
  3. #检查线程死锁
  4. jstack -m 28584 #pid

eg. 线程死锁时的线程快照:
在这里插入图片描述
会列出发生死锁的线程,死锁原因、代码位置

jmap 查看堆的使用情况、生成堆快照

  1. #查看堆的使用情况,包括最大|小堆内存、各年代的使用情况
  2. jmap -heap 28180
  3. # 查看所有的类的实例,包括类名、实例个数、每个实例的大小
  4. # 部分类名会简写,比如B=>byte,C=>char,I=>int
  5. jmap -histo 28180
  6. # 信息很多,可以使用管道命令分页查看
  7. jmap -histo 28180 | more
  8. # 生成堆快照文件。windows路径用\,linux用/
  9. jmap -dump:format=b,file=D:\heap_dump.hprof 28180 #pid
  10. jmap -dump:format=b,file=/usr/local/heap_dump.hprof 28180
  11. #jvm参数,发生OOM异常时自动生成dump文件,可用于复盘、定位问题
  12. -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\mall\

jhat 分析堆快照

  1. #默认使用端口7000,访问localhost:7000即可查看堆快照的分析信息
  2. jhat xxx.hprof
  3. #可以-p指定使用的端口
  4. jhat -p 9000 xxx.hprof

jconsole jvm状态可视化查看工具

可以查看本地、远程的jvm运行状态,信息多样

  1. jconsole
  2. #如果检测不到本地jvm进程时,可以手动指定jvm进程的pid
  3. jconsole 17412

jvisualvm 更加强大的jvm状态可视化查看工具

  1. #指定jvm进程的pid
  2. jvisualvm --openpid 17412
  3. #如果提示不能打开指定进程,删除hsperfdata_xxx文件夹后重试,xxx换为自己的用户名
  4. #C:\Users\xxx\AppData\Local\Temp\hsperfdata_xxx

IDEA可安装插件 VisualVM Launcher,设置VisualVM execuatble的路径为jdk bin目录下的jvisualvm.exe,这样就可以直接在IDEA中使用jvisualvm。

内存泄漏

  • 堆内存泄漏,常见现象:heap使用量明显上升、经常达到最大堆内存,出现OOM或频繁Full GC。解决方案:dump分析堆快照
  • 堆外内存泄漏:heap使用量很低、无明显变化,但出现OOM会频繁Full GC。解决方案:VisualVM -> 工具 -> 插件 -> 可用插件 -> 安装Btrace 进行分析

发表评论

表情:
评论列表 (有 0 条评论,344人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JDKJVM分析工具

    一、业务背景 对于分布式架构中的文件服务来说,由于涉及大量的IO流操作,很容易引发JVM的相关异常,尤其是内存溢出的问题; ![format_png][] 在最近的一