命令行工具
JDK提供了很多的工具来监控JVM。
这些工具都是支持RMI远程监控的,暂且不记录远程调试的办法
1. JPS
public class JPSTest { public static void main(String[] args) { while(true){} } }执行之。
C:\Users\huanggang>tasklist | findstr "java" javaw.exe 5600 Console 1 13,020 K使用jps查看
C:\Users\huanggang>jps -l 5600 com.prince.jvmtest.JPSTest 5596 sun.tools.jps.Jps
2. jstat: Statistics 虚拟机统计信息监视工具
能够显示VM进程中的类装载、内存、GC、JIT编译等运行数据。 是命令行中的首选工具。
jstat -gc 4904 250 10-gc 表示查看gc的工作情况,还有很多其他命令,大体上分为三类-class查看类加载情况-compiler查看JIT编译的情况等。
4904是用jps -l查看到的进程id
250是每隔多少ms查询一次
10是查询十次
3. jinfo Java配置信息工具
用于查看虚拟机的默认参数配置
运行时加入
-XX:+PrintFlagsFinal可以查看所有的默认参数
C:\Users\huanggang>jinfo -flag InitialSurvivorRatio 6744 -XX:InitialSurvivorRatio=8查看其中一个参数的值
另外还可以jinfo -flag key=value pid 这样的结构来修改一些运行期属性
4. jmap : Java内存映射工具
支持的功能有
-dump 生成Java堆转存储快照生成dump文件
-finalizerinfo 查看finalize执行排队情况,只有在linux上才能用
-heap 显示Java对详细信息,入使用哪种回收器等等。 只有在linux上才能用
生成dump文件
C:\Users\huanggang>jmap -dump:format=b,file=dump.dump 6744 Dumping heap to C:\Users\huanggang\dump.dump ... Heap dump file created
5.jhat 堆转存储快照分析工具
配合jmap生成的文件
C:\Users\huanggang>jhat C:\Users\huanggang\dump.dump Reading from C:\Users\huanggang\dump.dump... Dump file created Thu Oct 09 13:27:20 CST 2014 Snapshot read, resolving... Resolving 34438 objects... Chasing references, expect 6 dots...... Eliminating duplicate references......
然后访问http://localhost:7000/来查看结果
6. jstack Java堆栈跟踪工具
主要用来查看Java中每一个线程正在执行的方法堆栈的集合。 用来分析线程长时间停顿,比如死锁等原因。
Thread类中有一个getAllStackTraces()方法,能够完成大部分jstack的功能,可以考虑实现一个在线的堆栈查看工具。
可视化工具
1. Jconsole
很好的可视化工具,双击就可以运行,选择一个本地或者远程的进程就能够查看了。
不同的对应了不同的功能。
内存页签跟jstat功能类似,看下代码在Jconsole中的反应结果:
线程页类似于jstack
状态为:RUNNABLE, 还会有WAITING等等,来表示线程状态。
堆栈追踪:显示其被readBytes阻塞了
2. 还有收费的工具JProfile
3. VisualVM
jvisualvm.exe 也在安装目录下,功能很强大
可以在这个网站中下载插件,装了插件的VisualVM才是真的VVM:http://visualvm.java.net/plugins.html
前面介绍的所有命令行及JConsole的功能都包括了。
另外还可以右键的方式直接到处dump文件。
看下界面,很漂亮:
Profiles
能够收集一段时间内的内存或者CPU的性能数据,有点耗费资源,通常在程序开发的时候使用。
CPU会统计每个方法的执行耗时及次数
内存的话会分析每个方法关联对象数及每个对象所占用的空间。
另外一个有用的插件:BTrace动态日志跟踪技术。
感觉很有用,如果程序中出现问题,但是需要重新打印日志信息来观察方法参数和返回值等信息,就可以利用这个插件。 插件会提供一个界面输入一小段代码,然后在程序运行的时候同样会执行这样一小段代码,来达到动态日志的目的。
总结一下:JVM的监控和调优工作除了原理和工具外,还需要大量的经验才能够很好的完成,我本身的调优经验并不丰富。这里仅仅是提醒自己JVM提供了很多很好的工具,在注重性能的程序中可以尝试使用这些工具来使程序更加的完美。