不看不知道,一看吓一跳,原来JDK自带了这么多工具,本文主要介绍一下工作中常用的JDK工具以及使用方法和使用场景。
jps:虚拟机进程状况工具
是工作中排查问题使用率最高的命令之一,用于列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID。
- 语法是
jps [options] [hostid]
,常用的选项如下:
选项 | 作用 |
---|---|
-l | 输出主类的全名,如果进程执行的是jar包,输出jar路径 |
-v | 输出虚拟机进程启动时JVM参数 |
-q | 只输出pid,省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
- jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。
jstat:虚拟机统计信息监视工具
jstat是用于监视虚拟机各种运行状态信息的命令行工具。他可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期间定位虚拟机性能问题的首选工具。
- 语法为
jstat [option vmid [interval [s|ms] [count]] ]
,常用的选项如下:
jinfo:Java配置信息工具
用来实时查看和调整虚拟机各项参数。
- 语法为
jinfo [option] pid
,常用选项如下:
jmap:Java内存映像工具
jmap用于生成堆转储快照(一般称为dump),生成的dump文件用来我们分析解决问题,比如分析OOM,内存泄漏等问题。
- 语法为
jmap [option] vmid
,常用的选项如下: - 通常导出的dump文件需要借助可视化工具
jprofiler
、MAT
、JDK自带的visualVM
等工具来分析问题。
jhat:虚拟机堆转存储快照分析工具
jhat命令与jmap命令结合使用,来分析生成的dump文件。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件之后,可以在浏览器中查看。但是一般不推荐这么做,因为分析工作是一个耗时且耗费资源的过程。
jstack:Java堆栈跟踪工具
jstack命令用于生成虚拟机当前时刻的线程快照(一般为threaddump或javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间的等待的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等原因都是导致线程长时间停顿的原因。
- 语法为
jstack [option] vmid
,常用选型如下: - 比如我们写一个简单的死锁,然后用jstack看一下效果:
wangchengmingdeMacBook-Pro:~ wangchengming$ jstack 1445
省略部分日志。。。
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00007f935200dcb8 (object 0x00000007bfac9780, a java.lang.String),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00007f93520105f8 (object 0x00000007bfac97b8, a java.lang.String),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at OOMTest$Lock2.run(OOMTest.java:133)
- waiting to lock <0x00000007bfac9780> (a java.lang.String)
- locked <0x00000007bfac97b8> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)
"Thread-0":
at OOMTest$Lock1.run(OOMTest.java:113)
- waiting to lock <0x00000007bfac97b8> (a java.lang.String)
- locked <0x00000007bfac9780> (a java.lang.String)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
可以清楚的看到,jstack帮我们定位到了死锁,并告知我们哪行代码有问题,排查起来真的舒服啊。
JConsole:Java监视与管理控制台
JConsole是一款JDK提供的可视化监视、管理工具。
- 可以监视堆、线程、CPU等状态
- 监控内存使用状态
- 监控线程状态,并且可以帮助检测死锁
visualVM:多合一故障处理工具
visualVM是目前为止JDK发布的功能最强大的运行监视和故障处理程序。
- 显示虚拟机进程以及进程的配置信息(相当于jps、jinfo)
- 监视应用程序的CPU、GC、堆、方法区以及线程的信息(相当于jstat、jstack)
- dump以及分析堆转储快照(相当于jmap、jhat)
- 还有其他更加丰富的插件。。。
总结
JDK给我们提供了丰富的工具来方便我们排查问题,我们需要在掌握JVM基础知识的前提下,了解常用的工具是做什么的,能够帮助我们解决什么问题,这样子在遇到问题的时候,就可以快速的选择用什么工具,从而提升解决问题的效率。
来源:oschina
链接:https://my.oschina.net/u/4346575/blog/4406565