JVM运行观察常用命令梳理

Linux top命令

观察当前进程占用的CPU/内存比例等运行状态,
top -Hp 观察进程中的线程,哪个线程CPU和内存占比高

PID:进程ID,进程的唯一标识符
USER:进程所有者的实际用户名。
PR:进程的调度优先级。这个字段的一些值是'rt'。这意味这这些进程运行在实时态。
NI:进程的nice值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES:驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR:SHR是进程使用的共享内存。共享内存大小,单位kb
S:这个是进程的状态。它有以下不同的值:
  1.D - 不可中断的睡眠态。
  2.R – 运行态
  3.S – 睡眠态
  4.T – 被跟踪或已停止
  5.Z – 僵尸态
%CPU:自从上一次更新时到现在任务所使用的CPU时间百分比。
%MEM:进程使用的可用物理内存百分比。
TIME+:任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。
COMMAND:运行进程所使用的命令。进程名称(命令名/命令行)

java jps(Java Virtual Machine Process Status Tool)

java提供的可以查看当前的java进程

jstack

Jdk自带的线程跟踪工具,用于打印指定Java进程的线程堆栈信息。

JDK jstack  -l  [pid] 

定位线程状况,重点关注:WAITING BLOCKED

线程状态
NEW :未启动的。不会出现在Dump中。
RUNNABLE :在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。
BLOCKED :受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。
WATING :无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。
TIMED_WATING :有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。
TERMINATED :已退出的。

jinfo (Java Configuration Info)

jinfo -flag <name> PID

查看和调整JVM配置参数

标记为manageable的Flags

Linux环境:java -XX:+PrintFlagsInitial | grep manageable
Window环境:java -XX:+PrintFlagsInitial | findstr manageable

Linux jstat -gc

jstat -gc pid time

每time秒会显示一次进程号为pid的java进程的GC情况

java jmap

jmap - histo pid
jmap - histo pid |  head -20

查找有多少对象产生

相关参数:
-dump : 生成Java堆转储快照
-heap:显示Java堆详细信息
-histo:显示堆中对象统计信息

jmap -heap pid

显示堆栈信息

jmap -dump:format=b,file=jsconsole.bin pid

生成快照文件

快照文件利于排查线上问题,但是该命令执行期间会对进程产生很大影响。
可以设置参数-XX:+HeapDumpOnOutOfMemoryError,OOM的时候会自动产生堆转储文件
可参考:https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html

原文地址:https://www.cnblogs.com/farmersun/p/12446209.html