jConsole, jVisualvm, btrace 区别和联系
jConsole(jdk1.5+)和jVisualvm(以下简称jVv)(jdk1.6+)是jdk携带的java监控工具,在JAVA_HOME/bin/即可找到。btrace是一款可以在运行时更改执行代码的工具,在jVisualvm中有插件。
(由于jVisualvm在oracle的维护中断,已经移到了github继续维护,btrace的插件也是让我一顿好找。在jVv的新主页:https://visualvm.github.io/上,点击plugins来到https://visualvm.github.io/pluginscenters.html,获取符合自己jdk版本的jVv插件源。)
jConsole
jConsole是可视化监控java进程的工具,集成了很多功能。从图中可见包括内存,线程,加载类,CPU,VM概要等。个人感觉优势点在于:1. 可以远程可视化监控服务器的java进程;2.可以观测堆的不同区块的占用空间量(优于jVv默认功能)。
但是相较于jVv,不能heapdump,当然也没有很多功能性插件。
p.s.关于监控:使用过的falcon可以接受程序上报数据,如果自动上报jvm使用和gc情况,就可以随时随地监控机器jvm状态。
如果没有这些监控工具,我个人也还是觉得jstat监控空间自由度高。远程服务器可以ssh登录进行监控。
jVisualvm
在jdk1.6及以上提供,号称是all-in-one工具。感觉jConsole的功能是jVv的子集(其实在jVv中就有jConsole的插件。。)。默认携带的功能包括监视CPU,堆的总占用,线程和加载类信息,heapdump等。也支持远程访问。安装插件可以变成多面手。
可能是由于使用不够熟练,个人习惯监视java的堆空间和gc时,还是习惯性使用jstat -gcutil pid time的方式,还可以留底,在发现内存有泄漏可能时使用jmap -histo:live 或者jmap -dump:format=b,file=a.bin pid用MAT分析。但是btrace真的6。
p.s. 关于profile:有了jVv的profile工具,至少不用买jProfile了。
profile对线上的服务可能有较大影响,不建议开启。但是google的lightweight-profiler据称对线上影响很小可以随意使用。http://blog.csdn.net/ligeforrent/article/details/74004359
由于jdk1.5以上默认开启的“类共享”可能会导致jVv的Profile功能监视的程序崩溃,所以如果想要使用jVv进行profile,需要使用-Xshare:off手动关闭此优化。
btrace
在jVv的插件库中,可以安装btrace插件。安装后,可以在程序运行的过程中,直接进行代码更改。
图一,正在运行的程序
图二,用jVisualvm监控,并用bTrace插件植入代码
如图所示,正在运行的程序中有TimeKiller类的multiply方法。在通过jVisualvm进行监控过程中,直接用bTrace将打印返回值的代码植入,就可以在jVv中看到每次调用时执行的返回值,事实上还可以做很多事,如打印堆栈,参数;进行其他监视等。使用场景有很多,如不需要重启服务,就可以新增日志。非常6。