Skip to content

Commit 66d6aa4

Browse files
committed
docs(jvisualvm): add note about jvisualvm tool
1 parent 89d59cb commit 66d6aa4

6 files changed

Lines changed: 111 additions & 0 deletions
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
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+
![jmx-monitor](png/jmx-monitor.png)
31+
32+
### jvisualvm集成Visual-GC插件
33+
`Visual GC插件安装`
34+
* 到https://visualvm.github.io/pluginscenters.html去下载对应的Visual GC Plugins
35+
36+
![visual-gc-plugins](png/visual-gc-plugins.png)
37+
38+
* 更改visual-gc配置中心URL
39+
40+
![update-visual-gc-settings](png/update-visual-gc-settings.png)
41+
42+
* 安装Visual GC Plugin
43+
44+
![install-visual-gc-plugin](png/install-visual-gc-plugin.png)
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+
![visual-gc-view](png/visual-gc-view.png)
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)
45.4 KB
Loading

java/jvm/png/jmx-monitor.png

124 KB
Loading
21.8 KB
Loading

java/jvm/png/visual-gc-plugins.png

122 KB
Loading

java/jvm/png/visual-gc-view.png

82 KB
Loading

0 commit comments

Comments
 (0)