VisualVM(All-in-One Java Troubleshooting Tool)是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序,并且可以预见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。官方在VisualVM的软件说明中写上了“All-in-One”的描述字样,预示着它除了运行监视、故障处理外,还提供了很多其他方面的功能。如性能分析(Profiling),VisualVM的性能分析功能甚至比起JProfiler、YourKit等专业且收费的Profiling 工具都不会逊色多少,而且VisualVM的还有一个很大的优点:不需要被监视的程序基于特殊Agent运行,因此它对应用程序的实际性能的影响很小,使得它可以直接应用在生产环境中。这个优点是JProfiler、YourKit等工具无法与之媲美的。
VisualVM可以做到:
- 显示虚拟机进程以及进程的配置、环境信息(jps、jinfo)。
- 监视本地和远程JAVA应用程序的CPU、GC、堆、方法区以及线程的信息(jstat、jstack)。
- dump以及分析堆转储快照(jmap、jhat)。
- 方法级的程序运行性能分析,找出被调用最多、运行时间最长的方法。
- 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行Bug反馈。
- 具备插件扩展功能,因此提供了无限的可能性……
1、插件下载:
1、通过JDK/bin目录下的“jvisualvm.exe”启动VisualVM
2、点击“工具”→“插件”菜单,在"设置"面板首先设置新的“Java VisualVM 插件中心”的URL,可以到Plugins Centers查看对应版本的URL目录
3、点击“可用插件”面板,选择插件进行安装
2、推荐插件:
Visual GC(监控垃圾回收器):可看到JVM中堆内存的分代情况。
BTrace:在不停止目标程序运行的前提下,通过HotSpot虚拟机的HotSwap技术动态加入原本并不存在的调试代码。这项功能对实际生产中的程序很有意义:经常遇到程序出现问题,但排查错误的一些必要信息,譬如方法参数、返回值等,在开发时并没有打印到日志之中,以至于不得不停掉服务,通过调试增量来加入日志代码以解决问题。在VisualVM中安装了BTrace插件后,在应用程序面板中右键点击要调试的程序,会出现“Trace Application……”菜单,点击将进入BTrace面板。
3、监控远程主机上的JAVA应用程序
VisualVM连接远程服务器有两种方式:JMX和jstatd,两种方式都不能完美支持所有功能,例如JMX不支持VisualGC,jstatd不支持CPU监控,实际使用可同时配置上并按需选用。
jstatd配置
1、创建安全访问文件
在JAVA_HOME/bin目录中,创建名称为jstatdAllPolicy文件(这个文件名称也可以顺便起,不过要与jstatd启动时指定名称相同),将以下内容拷贝到文件中。并保证文件的权限和用户都正确。
grant codebase"file:${java.home}/../lib/tools.jar"{ permission java.security.AllPermission; };
2、启动jstatd服务
在JAVA_HOME/bin目录中,执行以下命令:
./jstatd -J-Djava.security.policy=jstatdAllPolicy -p 1099 -J-Djava.rmi.server.hostname=192.168.xxx.xxx &
当然这种可能后台运行失败,建议:
nohup ./jstatd -J-Djava.security.policy=jstatdAllPolicy -p 1099 -J-Djava.rmi.server.hostname=192.168.xxx.xxx
jstatd命令描述以及参数说明:
jstatd是一个基于RMI(Remove Method Invocation)的服务程序,它用于监控基于HotSpot的JVM中资源的创建及销毁,并且提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。
-J-Djava.security.policy=jstatdAllPolicy 指定安全策略文件名称
-p 1099 指定启动端口
-J-Djava.rmi.server.hostname=192.168.xxx.xxx 指定本机IP地址,在hosts文件配置不正常时使用,最好加上。
&表示后台运行,这样关闭shell窗口,程序也不会停止运行
3、本地VisualVM配置
在本地VisualVM的应用程序窗口,右键单击【远程】》【添加远程主机】》【主机名】中输入远程主机的IP地址,点击【高级设置】输入远程主机开启的监控端口,点击【确定】完成配置。
JMX配置
打开Tomcat的bin/catalina.bat,如果为linux或unix系统,则为catalina.sh文件 。
无限制访问
set JAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
需要用户名和密码访问
JAVA_OPTS='-Xms128m -Xmx256m -XX:MaxPermSize=128m
-Djava.rmi.server.hostname=192.168.1.8
-Dcom.sun.management.jmxremote.port=8088
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=/usr/java/default/jre/lib/management/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=/usr/java/default/jre/lib/management/jmxremote.access'
(jmxremote.access 在JAVA_HOME\jre\lib\management下有模板)
jmxremote.access 中显示
monitorRole readonly
controlRole readwrite
jmxremote.password中显示
monitorRole QED (QED为密码)
controlRole R&D
重新在visualvm中打开远程tomcat就可以使用JMX带来的功能了
4、No Jconsole Plugins Installed问题
如图,添加Jtop.jar即可