JVisualVM远程监控
1. 通过JMX方式监控远程linux上运行java程序远程服务器:要求在执行java程序时,加入若干参数:java-Dcom.sun.management.jmxremote.port=9999-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false-Djava.
1. 通过JMX方式监控远程linux上运行java程序
远程服务器:
要求在执行java程序时,加入若干参数:
java-Dcom.sun.management.jmxremote.port=9999-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false-Djava.rmi.server.hostname=192.168.131.129 MultiThreads
-Dcom.sun.management.jmxremote.port=9999:选取未被占用的端口
-Dcom.sun.management.jmxremote.authenticate=false不使用密码验证
-Djava.rmi.server.hostname=192.168.131.129填运行程序的主机的ip。需要在/etc/hosts中添加(外网ip计算机名)的记录,我当时添加了(192.168.131.129 xzhangcentosxzhangcentos)这条记录,否则会报“java.net.MalformedURLException:Local host name unknown: java.net.UnknownHostException: xzhangcentos:xzhangcentos:未知的名称或服务”错误。
MultiThreads:class文件的文件名。也可以加-jar xxxx.jar。
本地监控:Windows—JVisualVM:
Step 1:
Step 2:
Step 3: 双击新产生的连接
在这种方式下,java程序中断,监控连接随之中断。
jvisualvm无法直接把远程的Java程序的heap dump到本地的机器上。当我们点击jvisualvm的heap dump时,只能把heap dump到远程机器上的某台目录,然后还需要我们自己去把heap dump文件拷贝到本地,再用jvisualvm执行“文件”-“装入”,打开来分析。
2. 通过JMX方式监控远程Tomcat
如果Tomcat是部署在Linux/Unix主机上:
首先在Tomcat/bin目录下执行./shutdown.sh,关闭Tomcat服务。然后在catalina.sh中设置JAVA_OPTS处加上(原来JAVA_OPTS设置可能是注释掉的,不用管它,直接在这行后加):
JAVA_OPTS="$JAVA_OPTS-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false"
其中9999为设置的JMX端口号。
保存,关闭。再执行./startup.sh启动Tomcat服务。
然后,就可以通过上节中的方法添加对远程Tomcat的监控了。
需要注意的是,如果要再关闭Tomcat服务,需要将加入的这一行注释掉。否则关闭不成功。
如果Tomcat是部署在Windows主机上:
(资料显示,未实际验证)
打开Tomcat的bin/catalina.bat,找到
set JAVA_OPTS=%JAVA_OPTS%-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager-Djava.util.logging.config.file="%CATALINA_BASE%/conf/logging.properties,修改为:
· 无限制访问
在"rem---------------------------------------------------------------------------"下面添加一行:
setJAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false
· 需要用户名和密码访问
在"rem---------------------------------------------------------------------------"下面添加一行:
setJAVA_OPTS=-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=9008-Dcom.sun.management.jmxremote.authenticate=true-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.password.file=D:/temp/jmxremote.password-Dcom.sun.management.jmxremote.access.file=D:/temp/jmxremote.access
事实上,如果没有开放JMX功能,也可以监控远程服务器上执行的java程序。这就是jstatd方式。
3. 通过jstatd方式监控远程linux上运行的java程序
远程服务器:
Step 1:
需要先在$JAVA_HOME/bin下创建一个文件jstatd.all.policy,内容如下:
grant codebase"file:${java.home}/../lib/tools.jar" {
permissionjava.security.AllPermission;
};
Step2:
使用下面的命令来启动jstatd(注意,启动jstatd的用户要求跟启动Java程序的用户一致,不然jstatd就没有权限访问程序的信息了):
jstatd -p 8888 -J-Djava.security.policy=jstatd.all.policy
这里的8888是jstatd监听的端口,也就是我们要连接时使用的端口,jstatd.all.policy就是我们刚才创建的文件所在的路径。
启动之后,我们在添加的主机上右键,选择Add jstatd Connection,填上端口号8888,然后点击OK。
接下来我们就可以看到这台机器上所有的Java程序了(仅限启动jstatd的用户有权限查看的程序)。
如果远程服务器上启动了Tomcat,在jstatd下会被自动监控。但不像JMX方式那样可以看到线程的状态。
如果可以,最好是JMX和JStatd同时使用。只有JMX,是看不到Main Class和Arguments等信息的。有时jstatd只能查看信息,不能执行诸如Thread Dump和Heap Dump等操作。
更多推荐
所有评论(0)