|
| 1 | +# 目录 |
| 2 | +* [jvisualvm介绍](#jvisualvm介绍) |
| 3 | +* [jvisualvm使用](#jvisualvm使用) |
| 4 | + * [jvisualvm监控远程服务器](#jvisualvm监控远程服务器) |
| 5 | + * [jvisualvm集成Visual GC插件](#jvisualvm集成Visual-GC插件) |
| 6 | + * [jvisualvm集成XXX监控tomcat](#jvisualvm集成XXX监控tomcat) |
| 7 | +* [常见问题](#常见问题) |
| 8 | +* [引用](#引用) |
| 9 | + |
| 10 | +## jvisualvm介绍 |
| 11 | + 1. jvisualvm是JDK自带的可以远程监控内存,跟踪垃圾回收,执行时内存,CPU/线程分析,生成堆快照等的工具。 |
| 12 | + 2. jvisualvm是从JDK1.6开始被继承到JDK中的。 |
| 13 | + |
| 14 | +## jvisualvm使用 |
| 15 | + |
| 16 | +### jvisualvm监控远程服务器 |
| 17 | +`开启远程监控` |
| 18 | +* 通过在服务器上设置jmx参数来开启 |
| 19 | + ``` |
| 20 | + vi /etc/profile |
| 21 | + export JAVA_OPTS='-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=N -Djava.rmi.server.hostname=x.x.x.x -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false' |
| 22 | + ``` |
| 23 | +* 通过启动jar命令开启 |
| 24 | + ``` |
| 25 | + java -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=N -Djava.rmi.server.hostname=x.x.x.x -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar xxx.jar |
| 26 | + ``` |
| 27 | +
|
| 28 | +`连接` |
| 29 | +* 打开jvisualvm,在远程中添加需要监控的服务器,然后再在该服务器下添加jmx监控连接 |
| 30 | + |
| 31 | +
|
| 32 | +### jvisualvm集成Visual-GC插件 |
| 33 | +`Visual GC插件安装` |
| 34 | +* 到https://visualvm.github.io/pluginscenters.html去下载对应的Visual GC Plugins |
| 35 | +
|
| 36 | +  |
| 37 | +
|
| 38 | +* 更改visual-gc配置中心URL |
| 39 | +
|
| 40 | +  |
| 41 | +
|
| 42 | +* 安装Visual GC Plugin |
| 43 | +
|
| 44 | +  |
| 45 | +
|
| 46 | +`Visual GC正确开启步骤` |
| 47 | +* 在远程主机上添加安全策略文件 |
| 48 | + ```shell |
| 49 | + [root@localhost ~] touch jstatd.all.policy |
| 50 | + [root@localhost ~] vi jstatd.all.policy |
| 51 | + grant codebase "file:${java.home}/../lib/tools.jar" { |
| 52 | + permission java.security.AllPermission; |
| 53 | + }; |
| 54 | + ``` |
| 55 | + > 注意:如果没有配置JDK环境变量,file后需要添加tool.jar的绝对路径 |
| 56 | +* 在远程主机上启动监控 |
| 57 | + ```shell |
| 58 | + [root@localhost ~] jstatd -J-Djava.security.policy=/xxx/jstatd.all.policy -J-Djava.rmi.server.logCalls=true -J-Djava.rmi.server.hostname=xx.xx.xx.xx -p 1099 |
| 59 | + ``` |
| 60 | + * 参数说明 |
| 61 | + * -J-Djava.rmi.server.logCalls=true 打开日志,便于排错 |
| 62 | + * -J-Djava.rmi.server.hostname=xx.xx.xx.xx hostname是本机IP地址,确保client能访问到,另外查看本机的hosts是否有其他配置,这里有坑,具体参照常见问题中的[XXXX](#) |
| 63 | +* 可以查看端口是否被正常监听 |
| 64 | + ```shell |
| 65 | + [root@localhost ~]# lsof -i:1099 |
| 66 | + COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME |
| 67 | + jstatd 110703 root 15u IPv6 7374636 0t0 TCP *:rmiregistry (LISTEN) |
| 68 | + jstatd 110703 root 17u IPv6 7373817 0t0 TCP localhost:rmiregistry->x.x.x.x:62209 (ESTABLISHED) |
| 69 | + ``` |
| 70 | +* 使用visualvm连接 |
| 71 | + * 添加jstatd连接,注意端口号和远程服务器开启的端口号保持一致 |
| 72 | + > 注意:远程服务器端口要设置开放 |
| 73 | +
|
| 74 | +* 参考视图 |
| 75 | + |
| 76 | +
|
| 77 | +### jvisualvm集成XXX监控tomcat |
| 78 | +
|
| 79 | +# 常见问题 |
| 80 | +* 开启OOM-dump |
| 81 | + ```shell |
| 82 | + nohup java -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=N -Djava.rmi.server.hostname=x.x.x.x -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -XX:+HeapDumpOnOutOfMemoryError -jar xxx.jar -XX:HeapDumpPath=~/dumps/ > nohup.log 2>&1 & |
| 83 | + ``` |
| 84 | +
|
| 85 | +* Visual GC提示"不受此JVM支持“ |
| 86 | + ```log |
| 87 | + Could not create remote object |
| 88 | + access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") |
| 89 | + java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") |
| 90 | + at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) |
| 91 | + at java.security.AccessController.checkPermission(AccessController.java:884) |
| 92 | + at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) |
| 93 | + at java.lang.System.setProperty(System.java:792) |
| 94 | + at sun.tools.jstatd.Jstatd.main(Jstatd.java:139) |
| 95 | + ``` |
| 96 | +* Could not contact registry,指向的IP地址是一个其他的地址 |
| 97 | + ```log |
| 98 | + [root@localdomain bin]# ./jstatd -J-Djava.security.policy=jstatd.all.policy |
| 99 | + Could not contact registry |
| 100 | + Connection refused to host: y.y.y.y; nested exception is: |
| 101 | + java.net.ConnectException: Connection refused |
| 102 | + java.rmi.ConnectException: Connection refused to host: y.y.y.y; nested exception is: |
| 103 | + ``` |
| 104 | + > 注意:我在这里查看了远程机器的hosts,发现其配有一些其他的IP,将其删除后能够联通 |
| 105 | +* |
| 106 | +# 引用 |
| 107 | +* [jvisualvm简要说明](https://blog.csdn.net/weixin_38750084/article/details/83314046) |
| 108 | +* [jvisualvm 连接 jstatd 远程监控 jvm 或 Visual GC提示"不受此JVM支持“](https://blog.csdn.net/liupeifeng3514/article/details/78998161) |
| 109 | +* [使用Java VisualVM监控远程JVM](https://www.jianshu.com/p/2a6658e94ae2) |
| 110 | +* [Visualvm 远程测试 问题](https://www.cnblogs.com/kentyshang/archive/2009/08/20/1550745.html) |
| 111 | +* [visualgc - Visual Garbage Collection Monitoring Tool](https://www.oracle.com/technetwork/java/visualgc-136680.html) |
0 commit comments