跳至主要內容

JVM命令行工具篇

xw大约 5 分钟JVMJVM

JVM学习笔记-命令行工具篇

性能指标

  • 响应时间
  • 吞吐量
  • 并发数
  • 内存占用

jps

作用:查看增在运行的java进程

参数:

  • -q :仅仅显示LVMID(local virtual machine id),即本地虚拟机唯一ID,不显示类名称
  • -l: 输出应用程序主类的全类名
  • -v: 列出虚拟机进程启动时的JVM参数
  • -m 输出虚拟机进程启动传给主类main()的参数

jstat

作用:查看JVM统计信息,常应用于检测垃圾回收问题和OOM。

命令格式为:

 jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
  • -t : 显示程序的运行时间,单位为秒。
  • interval: 指定输出统计数据的周期,单位为毫秒。
  • count: 用于指定统计的总次数
  • -h: 输出表头数据
  • vmid: 进程id(通过jps命令获取)

option选项:

  • -class: 显示classloader相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间

  • -gc: 显示gc相关的堆信息

  • -gccapacity: 输出信息主要与gc相同,但输出主要关注堆各个区域用到的最小和最大空间

  • -gcutil: 显示内容与gc基本相同,主要关注百分比

  • -gccause: 与gcutil功能一样,但会输出最后一次gc的原因

  • -gcnew: 显示新生代GC状况

示例如下图:

  • SOC: 第一个幸存区大小,单位为字节
  • S1C: 第二次幸存区大小,单位为字节
  • S0U: 第一个幸存区已使用的大小,单位为字节
  • S1U: 第二个幸存区已使用的大小,单位为字节
  • EC: Eden空间的大小
  • EU: Eden已使用空间的大小
  • OC: 老年代的大小
  • OU:老年代已使用的大小
  • MC: 方法区的大小
  • MU: 方法区已使用的大小
  • CCSC: 压缩类空间的大小
  • CCSU: 压缩类已使用空间的大小
  • YGC: young gc次数
  • YGCT: yong gc消耗的时间
  • FGC: full gc次数
  • PGCT: full gc时间
  • GCT: 应用程序启动到采样gc总时间

jinfo

作用: 查看和修改JVM配置信息

命令格式为:

jinfo [option] <pid>
       
jinfo [option] <executable <core>
      
jinfo [option] [server_id@]<remote server IP or hostname>

#查看
jinfo -sysprops PID #查看由System.getProperties()取得的参数

jinfo -flags PID  #查看曾经赋值得一些参数

jinfo -flag 具体参数 PID #查看某个java进程的具体参数的值


#修改
jinfo -flag [+|-]具体参数 PID  ## boolean类型修改

jinfo -flag 具体参数=参数值 PID ##非boolean类型


只有标记为manageable的flag才可以被实时修改,查看manageable参数命令为 java --XX:+PrintFlagsFinal -version| grep manageable

jmap

作用:dump文件和获取堆内存使用情况

命令格式 :

jmap [option] <pid>

jmap [option] <executable <core>

jmap [option] [server_id@]<remote server IP or hostname>

常用命令:

1.手动导出内存映像文件  
# format =b表面格式与hprof对应起来,表面这是一个标准的格式
jmap -dump:format=b,file=d:\1.hprof PID

## live 只保存堆中存活的对象
jmap -dump:live,format=b,file=d:\1.hprof PID

2.OOM自动生成内存镜像文件
设置JVM参数;
-XX : +HeapDumpOnOutOfMemoryError:在程序发生00M时,导出应用程序的当前堆快照。
-XX:HeapDumpPath:可以指定堆快照的保存位置。

3.显示堆内存相关信息
jmap -heap PID >1.txt

jmap -histo PID>2.txt

4.查看系统的ClassLoader信息
jmap -permstat pid

5.查看堆积在finalizer队列中的对象
jmap -finalizerinfo 

由于jmap将访问堆中的所有对象,为了保证在此过程中不被应用线程干扰,jmap需要借助安全点机制,让所有线程停留在不改变堆中数据的状态。也就是说,由jmap导出的堆快照必定是安全点位置的。这可能导致基于该堆快照的分析结果存在偏差。

实例如下图:

jhat

作用:dump分析工具。使用了jhat命令,就启动了一个http服务,端口是7000,即http://localhost:7000/。open in new window jhat命令在JDK9、JDK10中已经被删除,官方建议用Visua1VM代替,所以不详细学习。

命令格式:

jhat filePath

示例如下:

访问http://localhost:7000open in new window,如图

jstack

作用:用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合。

命令格式:

 jstack [-l] <pid>
 jstack -F [-m] [-l] <pid>
 jstack [-m] [-l] <executable> <core>
 jstack [-m] [-l] [server_id@]<remote server IP or hostname>

option参数

  • -F :当正常输出的请求不被响应时,强制输出线程堆栈
  • -l : 除堆栈外,显示关于锁的附加信息入
  • -m: 如果调用到本地方法的话,可以显示C/C++的堆栈
  • -h: 帮助操作

jcmd

作用:它是一个多功能的工具,可以用来实现前面除了jstat之外所有命令的功能。比如:用它来导出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运行时间等,官方推荐使用jcmd代替其他命令。

常用命令:

1.列出所有JVM进程
jcmd -l 

2.查看指定PID支持的操作
jcmd PID help 

3.jcmd操作
jcmd PID 支持的操作

示例演示:

使用jcmd导出dump: