VisualVM链接远程Java进程

jstatd是一个RMI(Remove Method Invocation)的server应用,用于监控jvm的建立和结束,而且提供接口让监控工具(如VisualVM)能够远程链接到本机的jvms 。注意是jvms,就是说运行jstatd命令后能够用监控工具监控本用户(运行jstatd命令的用户)全部已经启动的java程序。html

jstatd的安装、启动、链接

JDK中默认就带 jstatd,以下图,Mac 下 JDK 默认安装在 /Library/Java/JavaVirtualMachines/版本号 目录下。java

image

 

启动方式以下:tomcat

一、在服务器上新建文件,命名为jstatd.all.policy内容为:安全

grant codebase "file:${java.home}/../lib/tools.jar" { 
   permission java.security.AllPermission; 
}; 
服务器

二、在远程主机上启动 jstatd 而且不要关闭。网络

在服务器上jstatd.all.policy所在目录下执行下面的命令
其中 /usr/local/java/bin/jstatd为jstatd所在路径,为${JAVA_HOME}/bin/jstatdjvm

/usr/local/java/bin/jstatd -J-Djava.security.policy=jstatd.all.policy 
工具

想指定端口能够用下面命令: .net

jstatd -J-Djava.security.policy=jstatd.policy -p 1099

 

三、VisualVM 中链接code

在客户端用visualvm链接部署jstatd的服务器ip,显示以下:
image

 

参考: http://comeonbabye.iteye.com/blog/1463133

添加完主机后,咱们还须要添加 JMX 链接 和 jstatd 链接。

image

 

 

 

jstatd 的安全问题

jstatd服务只能监视具备适当的本地访问权限的JVM,所以jstatd进程与被监控的JVM必须运行在相同的用户权限中。可是有一些特殊的用户权限,如基于UNIX(TM)为系统的root用户,它有权限访问系统中全部JVM的资源,若是jstatd进程运行在这种权限中,那么它能够监视系统中的全部JVM,可是这也带来了额外的安全问题。

jstatd服务不会对客户端进行任何的验证,所以运行了jstatd服务的JVMs,网络上的任何用户的都具备访问权限,这种暴露不是咱们所但愿的,所以在启动jstatd以前本地安全策略必需要加以考虑,特别是在生产环境中或者是在不安全的网络环境中。

若是没有其余安全管理器被安装,jstatd服务将会安装一个RMISecurityPolicy的实例,所以须要在一个安全策略文件中指定,该策略文件必须符合的默认策略实施的策略文件语法。

下面的这个示例策略将容许jstatd服务具备JVM所有的访问权限:

grant codebase "file:${java.home}/../lib/tools.jar" { 
   permission java.security.AllPermission; 
}; 

注:此处策略中的java.home,和JAVA_HOME不是一个概念,不要搞错了,此处的java.home指的是JRE的路径,这个是Java的系统属性,不须要手工指定,一般是这个jdk下面的jre路径,便可以认为${java.home}和${JAVA_HOME}/jre是等价,若是想查看这个变量的值,能够任意找一个运行着的Java应用,找到它的PID,而后经过以下jinfo命令查看就能够查看到java.home的值:

jinfo ${PID}|grep java.home

参考:

http://blog.csdn.net/fenglibing/article/details/17323515 

http://bijian1013.iteye.com/blog/2221434

 

JMX链接

jstatd的远程监控,CPU的监控我这里看不到,这时候就要用到 JMX的链接了。

 

JMX 配置

远程机器的程序须要加上JVM参数

-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=9090
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

备注:另外须要检查 hostname –i,看解析出来是否为本地的IP,如是127.0.0.1或者IP为多个IP中之一,则其余的IP无效,会链接不上。

也可使用以下的参数手动指定 hostname 或者 ip 地址

-Djava.rmi.server.hostname=192.168.0.1

而后就可使用菜单中的 “Add JMX Connection”,链接远程地址。

以 tomcat 为例, 咱们须要修改 catalina.sh 文件。
在下面这行上面添加文字。
  1. # ----- Execute The Requested Command ----------------------------------------- 
须要添加的文字:

JAVA_OPTS="-Djava.rmi.server.hostname=10.12.49.64
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8081
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false $JAVA_OPTS"
export JAVA_OPTS

注:第一行的ip为tomcat所在服务器的ip;第三行的端口为jmx使用的端口,确保此端口是未被占用的;(不要少了第一行,我一开始配置的时候就是没有第一行,jmx一直链接不上)

启动tomcat,netstat -aux 看看8080,8081端口是否被监听,若是被监听,说明配置成功了,而后在visualvm的远程选择ip,右键,添加“jmx链接”,成功链接就成功了

参考: http://abc08010051.iteye.com/blog/2162970

参考:
http://www.360doc.com/content/11/1010/09/7656248_154804096.shtml
相关文章
相关标签/搜索