Common Java Tools (JDK tools)
(只是简单说明,没有举例子,用时查找)在安装JDK时,JDK自带了好多有用的工具,这些工具能够帮助我们在控制台或者可视化界面解决一些我们程序的问题,或者查看程序,虚拟机的的状态等。
jps
jps命令能在控制台过滤出Java本身的进程以及运行的引导类(也就是引导的main方法所在的类),如果实在Linux平台上,我们可能会用类似的ps -ef | grep java
来查看Java进程。
jstat
jstat
命令一般用来定位问题,是比较快速地用于初步定位的一种方式,使用它可以看到JVM中每个区域的情况,根据不同的参数,可以看到每个区域的使用情况和比例。
例如jstat -gcutil<pid> 1000 2
其中代表进程号,1000代表每1000ms采集一次数据,也就是每秒采集一次,2代表总共采集两次数据。
-gcutil只是一个option选项,我们可以执行jstat -options
来查看一共可以支持多少选项。
jmap
jmap 后面经常接如下3个参数。
jmap -heap <pid>
,用于查看内存使用情况。一些OS上的JVM不支持这个参数。
jmap -histo <pid>
,用于输出获得对象数目和大小,也是一个统计结果,以文本形式输出,可以重定向到某文件中,然后进行查看。
jmap -dump:format=b,file=heap.bin <pid>
,它导出的文件和使用虚拟机参数-XX:HeapDumpOnOutOfMemoryError 导出的文件一样,都是导出JVM内存的信息形成的二进制文件,都可以使用MAT工具来分析,这个命令可以随时导出文件。
jmap的一个"坑",当使用它来dump内存时,系统会被暂停(要保证拷贝中内存没有变化)。它会先做一次Full GC再dump内存,活着的节点越多,时间越长。
jstack
jstack
主要用于输出线程信息,而我们主要看线程状态,在jstack中可以得到遍历的,通常使用jstack -l <pid>
命令,如果为输出线程信息,则可以尝试使用-F参数来强制输出。(主要用于查看线程状态和检测死锁)
jinfo
用来查看Java进程的详细参数情况,例如:输出以-XX:开头的参数。如果想查看某些运行时参数甚至去做一些修改,则可以使用jinfo。
JConsole
以上所说的都是控制台命令, JConsole是一个图形化工具,能查看进程一些常见的信息,例如,概述,内存,线程,类,VM摘要,MBean等
Visual VM
图形化工具集,集成非常多工具的平台,很好用。
MAT(Memory Analyzer Tool)
Java 内存分析工具,分析JVM内存的dump文件。一般情况下主要是查看OOM错误产生的dump文件,分析原因。
Btrace
当JVM发生宕机时,如果我们已经发现占用空间较大对象的类型,但是很难定位这个大对象到底是哪段代码所创建或写入的数据,如果翻阅代码来查找就太费劲了,在定位问题时,我们只想知道哪段代码中调用过出现问题的类中的某个方法或写入过数据,将调用过这个类的响应方法的"调用栈路径"打印出来即可,BTrace可以做到这一点。
Btrace使用字节码增强技术来实现代码的跟踪,它是直接修改字节码的,而不是创建子类。(具体使用参见网络教程吧,实在是没有用过。)