1 JDK 的命令行工具
1.1 jps
虚拟机进程状况工具
jps [options][hostid]
选项 | 作用 |
---|---|
-q | 只输出 LVMID,省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类 main() 函数的参数 |
-l | 输出主类的全名,如果进程运行的 jar 包,则输出 jar 的路径。 |
-v | 输出虚拟机进程启动时 JVM 参数 |
- 功能:可以列出正在运行的虚拟机进程,并线上虚拟机执行的主类名称及其本地虚拟机唯一ID(LVMID);
- 对于本地虚拟机来说,LVMID 和操作系统的进程ID是一致的;
- 其他的工具通常都需要依赖 jps 获取 LVMID;
- 主要选项:-q(只输出 LVMID)、-m(输出传给 main 函数的参数)、-l(输出主类的全名)、-v(输出虚拟机启动 JVM 参数);
1.2 jstat
虚拟机统计信息监视工具
jstat [ option vmid [interval[s|ms] [count]]]
选项 | 作用 |
---|---|
-class | 监视类装载、卸载数量、总空间以及类装载所耗费的时间 |
-gc | 监视 Java 堆状况,包括 Eden 区、两个 Survivor 区、老年代、永久代等容量、已用空间、GC 时间合集等信息 |
-gccapacity | 监视内容与 -gc 基本相同,但输出主要关注 Java 堆各个区域使用到的最大、最小空间 |
-gcutil | 监视内容与 -gc 基本相同,但输出主要关注已使用空间占总空间的百分比 |
-gccause | 与 -gcutil 功能已用,但是会额外输出导致上一次 GC 产生的原因 |
-gcnew | 监视新生代 GC 状况 |
-gcnewcapacity | 监视内容与 -gcnew 基本相同,输出主要关注使用到的最大、最小空间 |
-gcold | 监视老年代 GC 状况 |
-gcoldcapacity | 监视内容与 -gcold 基本相同,输出主要关注使用到的最大、最小空间 |
-gcpermcapacity | 输出永久代使用到的最大、最小空间 |
-cmpiler | 输出 JIT 编译器编译过的方法、耗时等信息 |
-printcompilation | 输出以及被 JIT 编译的方法 |
- 功能:监视虚拟机各种运行状态信息,包括类装载、内存、垃圾收集、JIT 等;
- 纯文本监控首选;
1.3 jinfo
Java 配置信息工具
jinfo [ option ] vmid
选项 | 作用 |
---|---|
-flag | 查询给定虚拟机参数的系统默认值 |
-flags | 查询所有虚拟机参数的系统默认值 |
-flag [ + | - ] | 允许或禁止给定虚拟机的参数 |
-flag name=value | 修改给定的虚拟机参数的值 |
-sysprops | 查询系统参数 properties |
- 功能:实时地查看虚拟机各项参数。虽然 jps -v 可以查看虚拟机启动参数,但是无法查看一些系统默认的参数。
- 支持运行期修改参数的能力,格式为“jinfo -flag name=value pid”;
1.4 jmap
Java 内存映像工具
jmap [ option ] vmid
选项 | 作用 |
---|---|
-heap | 显示 Java 堆详细信息 |
-histo | 显示堆中对象统计信息,包括类、实例数量、合计容量 |
-dump | 生成Java堆转储快照。格式为 -dump:[live,]format=b,file=,live 表示 dump 出存活的对象 |
-F | 当 -dump 没有反应时,可以强制生成 dump 快照 |
-finalizerinfo | 显示在 F-Queue 中等待 Finalizer 线程执行 Finalizer 方法的对象。 |
- 功能:用于生成堆转储快照(一般称为 heapdump 或 dump 文件);
- 其他可生成 heapdump 的方式:使用参数-XX:+HeapDumpOnOutOfMemoryError;使用参数 -XX:+HeapDumpOnCtrlBreak 然后使用 Ctrl+Break 生成;Linux 系统使用 kill -3 生成;
- 另外它还可以查询 finalize 执行队列、Java 堆和永久代的详细信息;
1.5 jhat
虚拟机堆转储快照分析工具
- 功能:用于分析 jmap 生成的 heapdump。其内置了一个微型的 HTTP 服务器,可以在浏览器查看分析结果;
- 实际很少用 jhat,主要有两个原因:一是分析工程会耗用服务器资源;功能相对 BisualVM、IBM HeapAnalyzer 较为简陋;
1.6 jstack
Java 堆栈跟踪工具
jstack [ option ] vmid
选项 | 作用 |
---|---|
-F | 当正常输出的请求不被响应是,强制输出线程堆栈 |
-l | 出堆栈外,显示关于锁的附加信息 |
-m | 如果调用到本地方法的话,可以显示 C/C++ 的堆栈 |
- 功能:用于生成虚拟机当前时刻的线程快照(一般称为 threaddump 或 javacore文件)。javacore 主要目的是定位线程出现长时间停顿的原因,比如死锁、死循环、请求外部资源响应长等;
- 另外 JDK 1.5后 Thread 类新增了 getAllStackTraces() 方法,可以基于此自己增加管理页面来分析;
7 HSDIS
JIT 生成代码反编译
- 现代虚拟机的实现慢慢地和虚拟机规范产生差距,如果要分析程序如果执行,最常见的就是通过软件调试工具(GDB、Windbg 等)断点调试,但是对于Java来说,很多执行代码是通过 JIT 动态生成到 CodeBuffer 中的;
- 功能:HSDIS 是官方推荐的 HotSpot 虚拟机 JIT 编译代码的反汇编工具,它包含在 HotSpot 虚拟机的源码中但没有提供编译后的程序,可以自己下载放到 JDK 的相关目录里;
2 JDK 的可视化工具
2.1 JConsole
Java 监视与管理控制台
- 是一种基于 JMX 的可视化监控和管理工具,它管理部分的功能是针对 MBean 进行管理,由于 MBean 可以使用代码、中间件服务器或者所有符合 JMX 规范的软件进行访问,因此这里着重介绍 JConsole 的监控功能;
- 通过 jconsole 命令启动 JConsole 后,会自动搜索本机所有虚拟机进程。另外还支持远程进程的监控;
- 进入主界面,支持查看以下标签页:概述、内存、线程、类、VM 摘要和 MBean;
2.2 VisualVM
多合一故障处理工具
- 目前为止 JDK 发布的功能最强调的运行监控和故障处理程序,另外还支持性能分析;
- VisualVM 还有一个很大的优点:不需要被监视的程序基于特殊 Agent 运行,对应用程序的实际性能影响很小,可直接应用在生成环境中;
- VisualVM 基于 NetBeans 平台开发,具备插件扩展功能的特性,基于插件可以做到:显示虚拟机进程以及进程配置、环境信息(jps、jinfo)、监视应用程序的 CPU、GC、堆、方法区以及线程的信息(jstat、jstack)、dump 以及分析堆转储快照(jmap、jhat)、方法级的程序运行性能分析,找出被调用最多运行时间最长的方法、离线程序快照(收集运行时配置、线程 dump、内存 dump 等信息建立快照)、其他 plugins 的无限可能。
- 使用 jvisualvm 首次启动时需要在线自动安装插件(也可手工安装);
- 特色功能:生成浏览堆转储快照(摘要、类、实例标签页、OQL控制台)、分析程序性能(Profiler 页签可以录制一段时间程序每个方法执行次数和耗时)、BTrace 动态日志跟踪(不停止目标程序运行的前提下通过 HotSwap 技术动态加入调试代码);
3 CPU 异常排查
cpu高的原因?无阻塞操作、循环、正则表达式回溯或纯粹的计算、线程死锁,程序 hang 住
- 定位高负载进程 pid
- top 命令
- 定位具体的异常业务
- pwdx 命令根据 pid 找到业务进程路径
- 定位异常线程及具体代码行
- top oder by with P:1040 // 首先按进程负载排序找到 maxLoad(pid)
- top -Hp 进程 PID:1073 // 找到相关负载 线程 PID
- printf “0x%x\n”线程 PID: 0x431 // 将线程 PID转换为 16进制,为后面查找 jstack 日志做准备
- jstack 进程 PID | vim +/十六进制线程PID - // 例如:jstack 1040|vim +/0x431 -
https://juejin.im/entry/5b3f33ccf265da0f8f2019c4
4 OOM 异常排查
https://www.ctolib.com/topics-119701.html