三、JVM - 基础故障处理工具

一、HotSpot参数分类

标准: - 开头,所有的HotSpot都支持
非标准:-X 开头,特定版本HotSpot支持特定命令
不稳定:-XX 开头,下个版本可能取消

  1. java -XX:+PrintCommandLineFlags -version 观查虚拟机配置

  2. java -XX:+PrintFlagsInitial 默认参数值

  3. java -XX:+PrintFlagsFinal 最终参数值

  4. java -XX:+PrintFlagsFinal | grep xxx 找到对应的参数

  5. java -XX:+PrintFlagsFinal -version |grep GC

二、JPS 虚拟机进程状况工具

jps 命令格式:

jps [ options ] [ hostid ]

jps 工具主要选项:

  • -q: 只输出 LVMID,省略主类的名称

  • -m: 输出虚拟机进行启动时传递给主类 main() 函数的参数

  • -l: 输出主类的全名,如果进程执行的是 JAR 包,则输出 JAR 路径

  • -v: 输出虚拟机进程启动时的 JVM 参数

三、jstat 虚拟机统计信息监视工具

​jstat ( JVM Statistics Monitoring Tool ) 是用于监视虚拟机各种运行状态信息的命令行工具。

jstat 命令格式:

jstat [ option vmid [ interval[s|ms] [count]] ]

参数 interval 和 count 代表查询间隔和次数,如果省略这两个参数,说明只查询一次。

如需要每1秒钟查询一次进行1234的垃圾收集情况,一共查询10次:

jstat -gc 1234 1000 10

jstat 工具主要选项:

  • -class: 监视类加载,卸载数量、总空间以及类装载所耗费的时间

  • -gc: 监视 Java 堆状况,包括 Eden 区、2个 Survivor 区、老年区、永久代等的容量,已用空间,垃圾收集时间合计等信息

  • -gccapacity: 监视内容与 -gc 基本相同,但输出主要关注 Java 堆各个区域使用到的最大、最小空间

  • -gcutil: 监视内容与 -gc 基本相同,但输出主要关注已使用空间占总空间的百分比

  • -gccause: 与 -gcutil功能一样,但是会额外输出导致上一次垃圾收集产生的原因

  • -gcnew: 监视新生代垃圾收集状况

  • -gcnewcapacity: 监视内容与 -gcnew 基本相同,输出主要关注使用到的最大、最小空间

  • -gcold: 监视老年代垃圾收集状况

  • -gcoldcapacity: 监视内容与 -gcold 基本相同,输出主要关注使用到的最大、最小空间

  • -gcpermcapacity: 输出永久代使用的最大、最小空间

  • -compiler: 输出即时编译器编译过的方法、耗时等信息

  • -printcompilation: 输出已经被即时编译的方法

四、jinfo Java 配置信息工具

jinfo( Configuration Info for Java ) 的作用是实时查看和调整虚拟机各项参数。

使用 jsp 命令的 -v 参数可以查看虚拟机启动时显示指定的参数列表,但如果想知道未被显示指定的参数的系统默认值,可以使用 jinfo 的 -flag 选项进行查询了( JDK 6 或以上版本,使用 Java -XX:+PrintFlagsFinal 查看参数默认值也是一个很好的选择)。

jinfo 还可以使用 -sysprops 选项把虚拟机进程的 System.getProperties() 的内容打印出来。

可以使用 -flag [+|-]name 或者 -flag name=value 在运行期修改一部分运行期可写的虚拟机参数值。

jinfo 命令格式:

jinfo [ option ] pid

如查询 ConcGCThreads 并发标记、并发整理的执行线程数值

jinfo -flag ConcGCThreads 1444

五、jmap Java 内存映像工具

jmap ( Memory Map for Java ) 命令用于生成堆转储快照(一般称为 heapdump 或 dump 文件),将VM 中的heap,以二进制输出成文本。

其它方式获得堆转储快照文件

  1. -XX:+HeapDumpOnOutOfMemoryError
    当OutOfMemoryError发生时自动生成 Heap Dump 文件。

  2. -XX:+HeapDumpBeforeFullGC
    当 JVM 执行 FullGC 前执行 dump。

  3. -XX:+HeapDumpAfterFullGC
    当 JVM 执行 FullGC 后执行 dump。

  4. -XX:+HeapDumpOnCtrlBreak
    交互式获取dump。在控制台按下快捷键Ctrl + Break时,JVM就会转存一下堆快照。

  5. -XX:HeapDumpPath=/Users/apple/Downloads/test.hprof
    指定 dump 文件存储路径。

  6. 在 Linux 系统下通过 Kill -3 命令发送进程退出信息号“恐吓”一下虚拟机,也能顺利拿到堆转储快照。

jmap 命令格式:

jmap [ option ] vmid

jmap 工具主要选项:

-dump: 使用hprof二进制形式,输出jvm的heap内容到文件,生成 Java 堆转储快照。格式为 -dum:[live,]format=b,file=filename, 其中 live 子参数说明是否只 dump 存活的对象。

-finalizeinfo: 显示在F-Queue 中等待Finalizer 线程执行 finalize 方法的对象。只在 Linux/Solaris 平台有效。

-heap: 显示 Java 堆详细信息,如使用哪种回收器、参数配置、分代状况等。只在 Linux/Solaris 平台有效。

-histo: 显示堆中对象统计信息,包括类、实例数量、合计容量。

-permstat: 以 ClassLoader 为统计口径显示永久代内存状态。只在 Linux/Solaris 平台有效。

-F: 当虚拟机进程对 -dump 选项没有响应时,可使用这个选项强制生成 dump 快照。只在 Linux/Solaris 平台有效。

列出实例对象最多的200个类:

jmap -histo:live pid | head -200

jmap -dump:live,format=b,file=testjmapname.dump pid

jmap -histo:live pid 在***:live***前会进行full gc,带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小
线上系统,内存特别大,jmap执行期间会对进程产生很大影响,甚至卡顿,线上慎用(电商不适合用)

六、jhat 虚拟机堆转储快照分析工具

JDK 提供 jhat ( JVM Heap Analysis Tool) 命令与 jmap 搭配使用,来分析 jmap 生成的堆转储快照。jhat 内置一个微型的 HTTP/Web 服务器,生成堆转储快照的分析结果后,可以在浏览器中查看,包括对象的数量,大小等等,并支持对象查询语言。Jhat 分析工具简漏,一般不用。

jhat testjmapname.dump

当屏幕显示"Server is ready." 的提示后,在浏览器中输入http://localhost:7000/ 可以看到分析结果。

使用MAT /jvisualvm 也可以进行dump文件分析。

七、jstack Java 堆栈跟踪工具

jstask ( Stack Trace for Java ) 命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等。

jstack 命令格式:

jstack [ option ] vmid

jstack 工具主要选项:

-F: 当正常输出的请求不被响应时,强制输出线程堆栈。

-l: 除堆栈外,显示关于锁的附加信息

-m: 如果遇到本地方法的话,可以显示 C/C++ 的堆栈

top + jsatck 找出的当前耗cpu的线程

  • top 观查进行,找出最耗cpu的进程

    $ top

  • top -Hp PID 观查进程中的线程信息,并找出最耗cpu的线程(假设上一步找出的PID是123456)

    $ top -Hp 123456

  • 将线程号转换为16进制

  • jstack PID | grep 转换为16进制的线程号(假设找出的线程号转换为16进制后为ab1234)

    $ jstack 123456 | grep ab1234

  • 最后得出来的信息即当前最繁忙的线程信息

八、Arthas在线排查工具

为什么需要在线排查?
在生产上我们经常会碰到一些不好排查的问题,例如线程安全问题,用最简单的threaddump或者heapdump不好查到问题原因。为了排查这些问题,有时我们会临时加一些日志,比如在一些关键的函数里打印出入参,然后重新打包发布,如果打了日志还是没找到问题,继续加日志,重新打包发布。对于上线流程复杂而且审核比较严的公司,从改代码到上线需要层层的流转,会大大影响问题排查的进度。

  • 观察jvm信息
  • thread定位线程问题
  • dashboard 观察系统情况
  • heapdump + jhat分析
  • jad反编译
    动态代理生成类的问题定位
    第三方的类(观察代码)
    版本问题(确定自己最新提交的版本是不是被使用)
  • redefine 热替换
    目前有些限制条件:只能改方法实现(方法已经运行完成),不能改方法名, 不能改属性
  • sc - search class
  • watch - watch method

arthas文档:https://alibaba.github.io/arthas/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值