1.概述:
在线上处理问题的时候,知识,经验是关键基础,数据 是依据,工具是知识处理数据的手段,本文说的数据包括主要是 指运行日志、异常堆栈、GC日志、快照 文件 等。在本文中,工具 主要是指JDK自带的工具,主要是 位于JDK的bin目录下面,如 图所示:
2.常见监控工具 & 指令
1. jps进程监控工具
该命令很像UNIX的PS命令,可以列出当前用户正在运行的虚拟机进程,功能虽单一,但使用频率超级高。
jps命令格式:
jps [options] [hostid]
jps工具的主要选项:
- -q: 不输出 类名称、Jar 名称 和传入 main 方法的 参数;
- -l: 输出 main 类或 Jar 的 全限定名称;
- -m: 输出传入 main 方法的 参数;
- -v: 输出传入 JVM 的参数
2. jstat-虚拟机统计信息监控工具
jstat 是用于识别 虚拟机 各种 运行状态信息 的命令行工具。它可以显示 本地 或者 远程虚拟机 进程中的 类装载、内存、垃圾收集、jit 编译 等运行数据。
jps命令格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
option 参数含义
- -t:可以在打印的列加上 timestamp 列,用于显示系统运行的时间。
- -h 可以在 周期性数据 的时候,可以在指定输出多少行以后输出一次 表头
vmid:进程ID
lines: 表头 与 表头 的间隔行数。
interval: 执行每次的 间隔时间,单位为 毫秒
count: 用于指定输出记录的 次数,缺省则会一直打印。
option 值的选项
- class: 显示 类加载 ClassLoad 的相关信息;
- compiler: 显示 JIT 编译 的相关信息;
- gc: 显示和 gc相关的 堆信息;
- gccapacity: 显示 各个代 的 容量 以及 使用情况;
- gcmetacapacity: 显示 元空间metaspace 的大小;
- gcnew: 显示 新生代 信息; gcnewcapacity: 显示 新生代大小 和 使用情况;
- gcold: 显示 老年代 和 永久代 的信息;
- gcoldcapacity: 显示 老年代 的大小;
- gcutil: 显示垃圾回收信息;
- gccause: 显示 垃圾回收 的相关信息(同 -gcutil),同时显示 最后一次 或 当前 正在发生的垃圾回收的诱
- printcompilation: 输出 JIT 编译 的方法信息
查看GC信息
其中S0,S1表示新生代两个Survivor区,E代表的是新生代的 Eden区,C的 意思是容量,u表示已经使用的意思,O表示 的老年代,M表示方法区。F和Y则 表示 fullGC和 minorGC(即年轻代GC)
3.jinfo配置信息查看工具
这个命令作用是实时查看和调整 虚拟机运行参数
jinfo 命令格式
jinfo [-options] <pid>
4.jmp 内存映射工具
该 命令主要是来 查看内存使用的详细信息
命令格式
jmap [-options] <pid>
选项参数的意思:
-heap:显示 Java堆中的详细信息
-histo: 显示对象的统计 消息
-clstats:显示 类加载 的统计信息
显示java对中的 详细信息
jmap -heap 2438
5.jstack 堆栈跟踪工具
该命令用于生成 java 虚拟机当前时刻的 线程快照。线程快照 是当前 java 虚拟机内 每一条线程 正在执行的 方法堆栈 的 集合。生成线程快照的主要目的是定位线程出现 长时间停顿 的原因,如 线程间死锁、死循环、请求外部资源 导致的 长时间等待 等等
命令格式:
jstack [-options] <pid>
option值选项:
- f 当正常输出请求 不被响应 时,强制输出 线程堆栈
- l 输出锁信息
m显示C++堆栈
显示当前线程快照并显示锁信息
jstack -l 2438
prio:线程的优先级
tid:线程id
nid:操作系统映射的线程id, 非常关键,后面再使用jstack时补充;
0x00007fbdf1920000:表示线程栈的起始地址
参考
《深入理解Java虚拟机》