对于使用命令行远程监控jvm太麻烦?那可以试试sun提供的jvisualvm.exe,jdk1.6自带了,可以到bin目录下找到它。
什么也不说了,直接运行此exe,打开界面如下:
(上图1左边的数可以看到,VisualVM分为3类,Local它会自动侦测到,并显示出来)
双击Local下的任一节点,看到右边的变化(有点像JProfiler)
看看Visual GC的界面(Java Heap的使用,一目了然)
再在左边的树形窗口,右键看看(看到了Thread Dump, Heap Dump)
做Thread Dump很快,马上就可以看到结果
Heap Dump要稍花费一些时间(可以看到当前heap里对象的数量及占用的比例,做OOM很好用)
(图6)
双击每一行,可以看到具体的信息
2、连接远程机器
(图8)
3、点击OK,看到会连接到远程机器,并显示出它下面的java进程。
到 这个时候的操作,就和上面Local的描述操作一样了。
最后,要注意的地方:
最好使用jdk1.6以上版本,不然visualVM很多功能不能用。
你自己也可以写一个VisualVM插件(基于NetBeans的插件体系),完成特殊的任务。
为了解决内存溢出的问题,会用到一些监视内存的工具,jconsole这个工具是jdk5.0自带的工具,所以如果你的jdk是5.0那么就不用去安装。 这个工具可以查看系统的 堆,非堆,线程,等等的一些整体的情况,从而可以判断出系统的一个大概的性能情况。
那么配置如下:如果你是用tomcat,在 catalina.bat来设置set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=7080 -Dcom.sun.management.jmxremote
特别注意:-Dcom.sun.management.jmxremote.port=7080,这个端点是jconsole专用的,不要和你的系统的端点冲突。再启动你的应用。
ok,配置好了后,就直接进dos命令 ,后 输入 java 回车, 再接着 输入 jconsole,它会弹出一个界面,你直接点“远程连接”的选项卡,主机就填你要监控的ip地址名,端口与 你配的-Dcom.sun.management.jmxremote.port 的端口一致就可以了,再连接就可以了。如果连接成功就会进入监控你的系统。
Java 5.0采用JMX方式提供了一系列监视和管理虚拟机的API,随SDK一起发布的JConsole则是采用这些API实现监控虚拟机的使用工具。 JConsole能够提供被监控虚拟机的内存、线程、类的加载以及MBean等信息,从而能够对服务器的运行情况进行实时监控。
1、环境
服务器:Redhat Linux ES 3.0 + JDK 1.5.06 + Jboss 4.0.2
ip地址:192.168.1.5
客户机:Windows + JDK 1.5.06
2、配置
修改java虚拟机启动参数
在%JBOSS_HOME%\bin\run.sh文件中将
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME "
修改为:
JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
注意:9999表示监控的端口号,确保指定的端口不被占用;可以采用netstat -an来查看已经占用的端口;配合lsof -i:portnum 来查看占用端口的具体应用程序;另外如果开启了防火墙服务,请确保端口能够透过防火墙访问;
启动JBoss服务器
./run.sh -b192.168.1.5,必须通过-b参数指定Jboss服务器绑定的地址;
连接远程虚拟机
启动%JAVA_HOME%\bin目录下的JConsole,在弹出对话框的“远程”属性页的“主机名或ip”中输入192.168.1.5,在“端口”中输入9999,选择“连接”,就能查看到远程Jboss服务器的运行情况了。