本地jvisualvm通过jstatd远程监控GC
1.查找jdk路径
[root@xxx ~]# which java
/data/soft/jdk1.8.0_221/bin/java
2.进入jdk的bin目录下添加指定安全策略文件,注意jdk路径要改成自己对应的路径
[root@xxx ~]# cd /data/soft/jdk1.8.0_221/bin [root@xxx bin]# vim jstatd.all.policy grant codebase "file:/data/soft/jdk1.8.0_221/lib/tools.jar" { permission java.security.AllPermission; };
3.jstatd.all.policy文件创建完成后,我们先在前台执行启动命令,并打开日志,确认配置无误。第一次启动推荐这样做,后面确认配置无误后,需要切换为后台启动,并且不打印日志信息。
# 前台启动并打印日志
[root@xxx bin]# ./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=47.142.158.25 -J-Djava.rmi.server.logCalls=true
# 后台启动并且不打印日志
[root@xxx bin]# ./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=47.142.158.25 &
-J-Djava.security.policy 安全策略文件的路径
-J-Djava.rmi.server.hostname 启动时的本机地址,因为我们要远程访问,所以这里要填机器的公网IP。
如果没有此参数就会以/etc/hosts里的地址进行启动,那里的ip映射一般不会是公网IP,所以也就不能远程访问了,当然你直接修改/etc/hosts文件中的ip地址也行,但这样有可能会影响到其他的应用。
-J-Djava.rmi.server.logCalls 启动时是否开启日志,默认为false。第一次启动的时候最好打开,以确定能够正常访问。后面真正使用的时候,就不要使用此参数了。
另外,启动的默认端口是1099,如果需要修改启动端口,则加上-p参数,例如:
[root@xxx bin]# ./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=47.142.158.25 -p 10099 -J-Djava.rmi.server.logCalls=true
4.检查端口开放,jstatd启动后不只使用了1099这个端口,还会启动一个随机端口,所以实际上需要开放两个端口。
[root@xxx bin]# netstat -antup|grep jstatd tcp 0 0 0.0.0.0:1099 0.0.0.0:* LISTEN 18490/./jstatd tcp 0 0 0.0.0.0:34476 0.0.0.0:* LISTEN 18490/./jstatd
我们看到,jstatd启动后使用了1099和34476端口,所以这两个端口都需要开放。
端口开放有两个地方需要检查,一是机器本身的防火墙端口开放,二是云服务器(如果有)的安全组策略。
5.查看jstatd是否启动成功
[root@xxx bin]# ./jps -l 6318 org.apache.catalina.startup.Bootstrap 25135 sun.tools.jps.Jps
这里就能看到jstatd能够监控的java进程。
6.启动本地jvisualvm进行远程连接,到本地机器的jdk目录下找到jvisualvm.exe,并进行远程连接。
在“远程”上右键鼠标,然后“添加远程主机”。
在“主机名”里填上你要监控的远程主机公网IP地址,“显示名称”起个自己好记的名字就好。填好了就点击“确定”。
此时在远程主机下就会列出所有的java进程,我们双击需要监控的进程,切换到“Visual GC”标签页,就能实时查看远程进程的GC过程了。
ps:第一次配置的话,需要将jvisualvm重启一下,这样远程主机才连接的上。之后再增加远程主机就不需要再重启了。
pps:如果是第一次使用jvisualvm,那还需要安装Visual GC插件。这个网上有很多教程了,搜一下就ok。
7.连接到远程主机后,有可能显示“不受此JVM支持”,出现这种情况是因为启动应用程序的用户和启动jstatd的用户不一致导致的,所以只要切换到应用程序用户,然后重启jstatd即可。