JDK命令行工具-jps、jinfo、jstat、jmap、jstack

主流工具概览

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 这些命令行工具是做什么的?
  • 每个工具解决了什么问题?
  • 每个工具的参数集合分哪几类?

基于实战进行问题定位

  • 进程监控:首先,找到生产环境中待定位的Java进程。
  • 配置查询:进一步,查看此Java进程的JVM配置。
  • JVM状态监控与初步分析:再进一步,查看此Java进程的内存、线程、JIT的整体情况。
  • 内存监控与分析:如果STEP3发现了可能的内存问题,就深入分析内存。
  • 线程监控与分析:如果STEP3发现了可能的线程问题,就深入分析线程。

进程监控:jps

  • jps的参数格式如下:
    jps [options] [hostid]
  • 常见使用方法
    • jps
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    • jps -q 输出main method的参数
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    • jps -l 输出完全的包名,应用主类名,jar的全路径名称
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    • jps -v 输出jvm参数

    • jps -m 输出传递给main方法的参数
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 更多详细使用方法,参考命令行手册:
    https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jps.html#CHDCGECD

配置查询:jinfo

  • jinfo的参数格式如下:
    jinfo [options] pid
  • 常见使用方法
    • jinfo [pid] 查看此jvm进程所有配置
    • jinfo -sysprops [pid] 等价于查看System.getProperties()
    • jinfo -flags [pid] 查看所有参数
    • jinfo -flag [参数名] [pid] 查看某个参数的值
    • jinfo -flag name=value 不需要重启Java虚拟机,修改指定名称的参数为指定的值
    • jinfo [+|-]name 启用或禁用指定名称的参数,该参数必须为Boolean类型
  • 更多详细使用方法,参考命令行手册:
    https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jinfo.html#BCGEBFDD

JVM状态监控与初步分析:jstat

  • jstat的参数格式如下:
    jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]
  • 常见使用方法
    • jstat -class -t -h3 [pid] 1000 5 采集类加载信息(每1000ms采集1次,采集5次,每3行打印1次表头)
    • jstat -compiler -t -h3 [pid] 1000 5 采集JIT信息
    • jstat -printcompilation -t -h3 [pid] 1000 5 采集已经被JIT编译过的方法
    • jstat -gc -t -h3 [pid] 1000 5 采集垃圾回收堆统计信息
    • jstat -gccapacity -t -h3 [pid] 1000 5 采集内存池生成和空间容量信息
    • jstat -gcutil -t -h3 [pid] 1000 5 采集垃圾收集统计汇总信息
  • 更多详细使用方法,参考命令行手册:
    https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jstat.html#BEHHGFAE

内存监控与分析:jmap

  • jmap的参数格式如下:
    jmap [options] pid
  • 常见使用方法
    • jmap -heap [pid] 打印堆得汇总信息
  • 更多详细使用方法,参考命令行手册:
    https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jmap.html#CEGCECJB

线程监控与分析:jstack

  • jstack的参数格式如下:
    jstack pid
  • 常见使用方法
    • jstack [pid] 打印当前进程的线程快照信息
  • 更多详细使用方法,参考命令行手册:
    https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jstack.html#BABGJDIF

补充内容

  • Java语言定义了6种线程状态
    • NEW:创建后尚未启动的线程处于这种状态,不会出现在Dump中
    • RUNNABLE:包括Running和Ready。线程开启start()方法,会进入该状态,在虚拟机内执行的
    • WAITING:无限的等待另一个线程的特定操作
    • TIMED WAITING:有时限的等待另一个线程的特定操作
    • BLOCKED:在程序等待进入同步区域的时候,线程将进入这种状态,在等待监视器锁
    • TERMINATED:已终止线程的线程状态,线程已经结束执行
  • Dump文件的线程状态一般以下4种
    • RUNNABLE:线程处于执行中
    • BLOCKED:线程被阻塞
    • WAITING:线程正在等待
    • TIMED_WAITING:线程正在等待
  • Dump文件重点关键词
    • runnable:线程处于执行中
    • deadlock:死锁(重点关注)
    • blocked:线程被阻塞 (重点关注)
    • parked:停止
    • locked:对象加锁
    • waiting:线程正在等待
    • waiting to lock:等待上锁
    • Object.wait():对象等待中
    • waiting for monitor entry:等待获取监视器(重点关注)
    • Waiting on condition:等待资源(重点关注),最常见的情况是线程在等待网络的读写

实战使用

  • jstack排查死锁

    • jps
    • jstack
  • jstack排查CPU过高

    • top
    • top -Hp pid
    • jstack pid
    • jstack -l [PID] >/tmp/log.txt
  • GC频繁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值