jvisualvm远程监控java虚拟机

时间:2022-12-27 19:26:55

我是使用java -jar ×× 运行java程序,其实tomcat也差不多也是在catalina.sh中配置rmi的一些东西,详情见下面:

1、jstatd远程不可取【血泪】

1、配置jstatd

vi  $JAVA_HOME/jre/lib/security/Java.policy
在文件末位的 }; 前添加
permission java.security.AllPermission;
2、启动jstatd
cd $JAVA_HOME/bin
./jstatd -J-Djava.security.policy=all.policy &
启动后会开启注册端口1099和一个随机的连接端口,注册端口也可通过-p参数指定,如./jstatd -J-Djava.security.policy=all.policy -p 10003 &
除了把1099添加到防火墙规则外,还需要找到另外一个随机端口,也加入到规则中
执行
netstat -anp | grep *jstatd

3、其他校验
(1)用hostname -i 命令查看返回的IP地址是不是127.0.0.1,如果不是的话则说明是其它原因造成,无需再往下看了,否则进行入第2步。
(2)打开/etc下的hosts文件,将其中的“127.0.0.1   机器名”改成"你机器的IP  机器名"。
           例如:将127.0.0.1  ubuntuServer,改成192.168.1.99  ubuntuServer
(3)重新启动jstatd进程。 如果在本地用jps 192.168.1.99可以看到远程java进程则说明成功了,此时你应该可以在VisualVM中通过jstatd方式连接远程主机了

4、解决问题
策略1、如果无法查看 关闭Linux上的防火墙试试
1) 重启后生效 开启: chkconfig iptables on  关闭: chkconfig iptables off
2) 即时生效,重启后失效 开启: service iptables start 关闭: service iptables stop
策略2、还是无法连接远程并且jps使用正常
1、查看telnet服务是否开启,开启telnet服务【关闭无法远程jvm】
策略3:一般jdk版本要高于远程机器版本

5.其它事项

(1)使用远程主机监控方式,即jstatd方式时,每次启动工具时会自动检测并连接已配置的监控主机,但无法提供远程主机内存的快照和具体信息,仅可提供cpu和内存的使用监控信息,使用jmx方式连接,如果远程的java进程重启,则需要重新建立连接,因为远程的java进程ID已变化 。、

(2)同时在jvisualvm中添加JMX链接,就可以想本机一样查看内存、线程信息。具体配置如下。

2、jconsole


设置vm堆大小以及,配置远程监控参数

设置远程端口为8999,不需要用户名密码验证,初始化堆内存为64M、最大堆内存为128M、新生代为20M,Survivor区与Eden区内存为2:8

Java -Djava.rmi.server.hostname=主机ip -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar -Xms64M -Xmx128M -Xmn20M -XX:SurvivorRatio=2 ./live-scheduled-0.0.1-SNAPSHOT.jar

此时就可以用jconsole工具进行远程监控了,只需要使用主机ip+端口就可以连接成功

如果要让远程监控连接需要密码那么配置如下

java -Djava.rmi.server.hostname=主机IP -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxrete.ssl=false -Dcom.sun.management.jmxremote.pwd.file=/data/java/jdk1.8/jre/lib/management/jmxremote.password -jar -Xms64M -Xmx128M -Xmn20M -XX:SurvivorRatio=2 ./live-scheduled-0.0.1-SNAPSHOT.jar

并将jre目录下面jre/lib/management目录下面jmxremote.password.template复制一份到该目录,命名为jmxremote.password,然后将jmxremote.password文件内容全删除掉,

然后配置两个用户,一个为只读权限,一个为控制权限,文件内容如下

  1. monitorRole  密码  
  2. controlRole   密码 

然后在远程监控时就需要用用户名和密码连接了。