进入到安装jdk的bin目录,发现还有一系列辅助工具
这些辅助工具用来获取目标 JVM 不同方面、不同层次的信息,帮助开发人员很好地解决Java应用程序的一些疑难杂症
官方源码地址:http://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/jdk.jcmd/share/classes/sun/tools
-q:仅仅显示LVMID(local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等
-l:输出应用程序主类的全类名 或 如果进程执行的是jar包,则输出jar完整路径
-m:输出虚拟机进程启动时传递给主类main()的参数
-v:列出虚拟机进程启动时的JVM参数。比如:-Xms20m -Xmx50m是启动程序指定的jvm参数
注:
如何将信息输出到同级文件中:【语法:命令 > 文件名称】
选项option可以由以下值构成
类装载相关的:
-class:显示ClassLoader的相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间等
-class举例:jstat -class -t -h3 13152 1000 10,其中h3中的3代表每隔3个分隔一次,13152代表类的进程id,1000代表每隔1000毫秒打印一次,10代表一共打印10次,如下所示:
垃圾回收相关的:
【1】-gc:显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息
-gc举例:jstat -gc 13152,其中13152代表类的进程id,执行结果如下所示:
【2】-gccapacity:显示内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gccapacity举例:jstat -gccapacity 13152,其中13152代表类的进程id,执行结果如下:
【3】-gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gcutil举例:jstat -gcutil 13152,其中13152代表类的进程id,执行结果如下所示:
【4】-gccause:与-gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因
-gccause举例:jstat -gccause 13152,其中13152代表类的进程id,执行结果如下:
【5】-gcnew:显示新生代GC状况
【6】-gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
【7】-geold:显示老年代GC状况
【8】-gcoldcapacity:显示内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
【9】-gcpermcapacity:显示永久代使用到的最大、最小空间
JIT相关的:
-compiler:显示JIT编译器编译过的方法、耗时等信息
-printcompilation:输出已经被JIT编译的方法
可以在输出信息前加上一个Timestamp列,显示程序的运行时间。单位:秒
补充:
我们可以比较Java 进程的启动时间以及总 GC时间(GCT列),或者两次测量的间隔时间以及总GC时间的增量,来得出GC时间占运行时间的比例
如果该比例超过 20%,则说明目前堆的压力较大;如果该比例超过90%,则说明堆里几乎没有可用空间,随时都可能抛出OOM异常
执行jstat -gc -t 13152 1000 10,这代表1秒打印出1行,一共10行,-t代表打印出Timestamp总运行时间,结果如下所示:
上方红色框框中代表Timestamp,而蓝色框框中代表垃圾回收时间,单位都是秒,如果让红色框框中的某两个值相减,假设这个值是num1,然后让对应行的蓝色框框中的另外两个值相减,假设这个值是num2,之后让num2/num1,得出的差值就是上述所说的GC时间占运行时间的比例
虽然这种方式比较繁琐,但是在项目部署之后就需要使用命令行去看了,就没有可视化界面了,所以这种方式也要会
C:\Users\AlphonseKino>jinfo Usage: jinfo [option] <pid> (to connect to running process) jinfo [option] <executable <core> (to connect to a core file) jinfo [option] [server_id@]<remote server IP or hostname> (to connect to remote debug server) where <option> is one of: -flag <name> to print the value of the named VM flag -flag [+|-]<name> to enable or disable the named VM flag -flag <name>=<value> to set the named VM flag to the given value -flags to print VM flags -sysprops to print Java system properties <no option> to print both of the above -h | -help to print this help message
选项 | 选项说明 |
---|---|
no option | 输出全部的参数和系统属性 |
-flag name | 输出对应名称的参数 |
-flag [±]name | 开启或者关闭对应名称的参数 只有被标记为manageable的参数才可以被动态修改 |
-flag name=value | 设定对应名称的参数 |
-flags | 输出全部的参数 |
-sysprops | 输出系统属性 |
jinfo -sysprops 进程id
可以查看由System.getProperties()取得的参数
13152代表进程id
jinfo -flags 进程id
jinfo -flag 参数名称 进程id
查看某个java进程的具体参数信息
针对boolean类型
jinfo -flag [+|-]参数名称 进程id
针对非boolean类型
jinfo -flag 参数名称=参数值 进程id
java -XX:+PrintFlagsInitial
java -XX:+PrintFlagsFinal
查看所有JVM参数的最终值
值前面添加**冒号:**的是修改之后的值,没有添加的都是没有发生改变的初始值
java -参数名称:+PrintCommandLineFlags
基本语法:
jmap [option]
jmap [option] <executable
jmap [option] [server_id@]
option包括:
选项 | 作用 |
---|---|
-dump | 生成dump文件(Java堆转储快照),-dump:live只保存堆中的存活对象 |
-heap | 输出整个堆空间的详细信息,包括GC的使用、堆配置信息,以及内存的使用信息等 |
-histo | 输出堆空间中对象的统计信息,包括类、实例数量和合计容量,-histo:live只统计堆中的存活对象 |
-J | 传递参数给jmap启动的jvm |
-finalizerinfo | 显示在F-Queue中等待Finalizer线程执行finalize方法的对象,仅linux/solaris平台有效 |
-permstat | 以ClassLoader为统计口径输出永久代的内存状态信息,仅linux/solaris平台有效 |
-F | 当虚拟机进程对-dump选项没有任何响应时,强制执行生成dump文件,仅linux/solaris平台有效 |
自动的两种方式:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=<filename.hprof>
当程序发生OOM退出系统时,一些瞬时信息都随着程序的终止而消失,而重现OOM问题往往比较困难或者耗时。此时若能在OOM时,自动导出dump文件就显得非常迫切。
这里介绍一种比较常用的取得堆快照文件的方法,即使用:
参数 | 说明 |
---|---|
-stack false | true | 关闭 / 打开对象分配调用栈跟踪 |
-refs false | true | 关闭 / 打开对象引用跟踪 |
-port port-number | 设置jhat HTTP,Server的端口号,默认7000 |
-exclude exclude-file | 执行对象查询时需要排除的数据成员 |
-baseline exclude-file | 指定一个基准堆转储 |
-debug int | 设置debug级别 |
-version | 启动后显示版本信息就退出 |
基本语法:jstack [option] [pid]
C:\Users\AlphonseKino>jstack Usage: jstack [-l] <pid> (to connect to running process) jstack -F [-m] [-l] <pid> (to connect to a hung process) jstack [-m] [-l] <executable> <core> (to connect to a core file) jstack [-m] [-l] [server_id@]<remote server IP or hostname> (to connect to a remote debug server) Options: -F to force a thread dump. Use when jstack <pid> does not respond (process is hung) -m to print both java and native frames (mixed mode) -l long listing. Prints additional information about locks -h or -help to print this help message
option参数
参数 | 说明 |
---|---|
-F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
-l | 除堆栈外,显示关于锁的附加信息 |
-m | 如果调用本地方法的话,可以显示C/C++的堆栈 |
-h | 帮助操作 |
jstack管理远程进程的话,需要在远程程序的启动参数中增加:
-Djava.rmi.server.hostname=···.. -Dcom.sun.management .jmxremote -Dcom.sun.management .jmxremote.port=8888 -Dcom.sun.management .jmxremote.authenticate=false -Dcom. sun.management .jmxremote.ssl=false
如果程序出现等待问题,可以使用该指令去查看问题所在,结果中也会提示你问题所在
语句 | 说明 |
---|---|
jcmd -l | 列出所有的JVM进程 |
jcmd 进程号 help | 针对指定的进程,列出支持的所有具体命令 |
jcmd 进程号 具体命令 | 显示指定进程的指令命令的数据 |