前言
本文将介绍以下工具的使用:jps、jstat、javac、javap、jstack、jamp、jinfo。
一,jps:虚拟机进程状况工具
可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(main()函数所在的类)名称以及这些进程的本地虚拟机唯一 ID。
jsp命令格式:
jps [ options ] [ hostid ]
jps工具主要选项:
二,jstat:虚拟机统计信息监视工具
jstat 是用于监视虚拟机各种运行状态信息的命令行工具。
它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据
,在没有 GUI 图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
jstat 命令格式为:
jstat [ option pid [ interval [ s | ms] [ count ] ] ]
参数 interval 和 count 代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:
jstat -gc 2764 250 20
选项 option 代表着用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期编译状况
,具体选项及作用请参考下图:
三,javac:编译工具
编译器,用于将 .java 文件编译成 虚拟机能读懂的 .class 文件。
命令格式:
javac <options> <source files>
options 常用选项包括:
-g 生成所有调试信息
-d <目录> 指定放置生成的类文件的位置
编译命令格式:
javac -d destdir srcFile
-d destdir
是用来指定存放编译生成的 .class 文件的路径。
若此选项省略,那么默认在当前目录下生成 .class 文件,并且没有生成包文件夹;当前目录可以用“.”来表示,即:javac -d . srcFile;添加-d选项除了可以指定编译生成的.class文件的路径外,最大的区别是可以将源文件首行的package关键字下的包名在当前路径下生成文件夹。
srcFile 是源文件 .java 文件的路径。
四,javap:反解析工具
javap 是 jdk 自带的反解析工具。它的作用就是根据 class 字节码文件,反解析出当前类对应的 code 区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息
。
当然这些信息中,有些信息(如本地变量表、指令和代码行偏移量映射表、常量池中方法的参数名称等等)需要在使用 javac 编译成 class 文件时,指定参数才能输出,比如,你直接 javac xx.java
,就不会在生成对应的局部变量表等信息,如果你使用 javac -g xx.java
就可以生成所有相关信息了。
javap的用法格式:
javap <options> <classes>
其中 classes 就是你要反编译的 .class 文件。
在命令行中直接输入javap或 javap -help 可以看到 javap 的 options 全部选项,常用如下:
-v 不仅会输出行号、本地变量表信息、反编译汇编代码,还会输出当前类用到的常量池等信息
-l 输出行号和本地变量表信息
-c 对当前class字节码进行反编译生成汇编代码
查看汇编代码时,需要知道里面的jvm指令,可以参考 官方文档
五,jstack:堆栈跟踪工具
jstack 命令用于生成虚拟机当前时刻的线程快照。
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源。
jstack命令格式:
jstack {option} {pid}
option选项的合法值与具体含义见表:
例子:利用 jstack 生成虚拟机中所有线程的快照:
jstack -l {pid} > {文件位置}
六,jmap:内存映像工具
jmap 命令
用于生成堆转储快照
(一般称为 heapdump 或 dump 文件)。
如果不使用 jmap 命令,要想获取Java堆转储快照,还有一些比较“暴力”的手段:在启动时加上 -XX:+HeapDumpOnOutOfMemoryError
参数,可以让虚拟机在 OOM 异常出现之后自动生成 dump 文件。
jmap 的作用并不仅仅是为了获取 dump 文件,它还可以查询 finalize 执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。
jmap命令格式:
jmap {option} {pid}
option 选项的合法值与具体含义见表:
使用 jmap 生成一个正在运行的 Eclipse 的 dump 快照文件:
jmap -dump:format=b,file=./dump.hprof {pid}
七,jinfo: Java配置信息工具
jinfo(Configuration Info for Java)的作用是实时地查看和调整虚拟机各项参数。
jinfo 命令格式:
jinfo {option} {pid}
option 值:
1,-flag
:使用 jps 命令的 -v 参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用 jinfo 的 -flag 选项进行查询了。
2,-sysprops
:把虚拟机进程的System.getProperties()的内容打印出来。
执行样例:查询 CMSInitiatingOccupancyFraction 参数值。
jinfo -flag CMSInitiatingOccupancyFraction 1444
评论区