配置 jstatd.policy 并启动jstatd
cd /opt
mkdir jstatd
mkdir jmx
# 新建 jstatd.policy 文本文件
vim /opt/jstatd/jstatd.policy
# 输入如下内容并保存
grant codeBase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
# 遇到没有权限操作加入如下的内容
grant {
permission java.util.PropertyPermission "*", "read,write";
}
# 新建jstatd.sh文件,用于启动
vim /opt/jstatd/jstatd.sh
# 输入如下内容
#!/bin/sh
# 获取 jstatd 线程id并杀死
PID=`jps | grep Jstatd | awk '{print $1}'`
if [ -n "$PID" ]; then
echo "kill -9 $PID ..."
kill -9 $PID
fi
# 启动jstatd
jstatd \
-J-Djava.rmi.server.hostname=x.x.x.x \
-J-Djava.security.policy=/opt/jstatd/jstatd.policy -J-Djava.rmi.server.logCalls=true \
-J-Xms128M \
-J-Xmx128M \
-J-XX:NewRatio=1 \
-J-XX:SurvivorRatio=8 \
-J-XX:PermSize=16M \
-J-XX:MaxPermSize=16M \
< /dev/null &> /opt/jstatd/jstatd.log &
# chmod +x /opt/jstatd/jstatd.sh 赋予执行权限
# 启动jstatd /opt/jstatd/jstatd.sh
# 查看jstatd是否启动
[root@iZuf642z8nxxensw71zj0aZ ~]# jps -l
1066 sun.tools.jstatd.Jstatd
12383 sun.tools.jps.Jps
# 查看监听的端口
[root@iZuf642z8nxxensw71zj0aZ ~]# netstat -anp | grep jstatd
tcp 0 0 0.0.0.0:1099 0.0.0.0:* LISTEN 1066/jstatd
tcp 0 0 0.0.0.0:45451 0.0.0.0:* LISTEN 1066/jstatd
tcp 0 26974 172.19.31.45:45451 47.116.60.25:55739 ESTABLISHED 1066/jstatd
tcp 0 14094 172.19.31.45:45451 180.165.239.210:56506 ESTABLISHED 1066/jstatd
unix 2 [ ] STREAM CONNECTED 49080291 1066/jstatd
参数 | 含义 | 值 |
---|---|---|
java.rmi.server.hostname | 当前机器ip | x.x.x.x |
java.rmi.server.hostname | 远程访问当前机器ip | x.x.x.x |
java.security.policy | 安全策略存放路径 | /opt/jstatd/jstatd.policy |
java.rmi.server.logCalls | 日志调用 | true |
Xms | jvm启动时分配的内存 | 128M |
Xmx | jvm运行过程中分配的最大内存 | 128M |
Xss | jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M | |
XX:NewRatio | 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代) | |
XX:SurvivorRatio | 设置年轻代中Eden区与Survivor区的大小比值 | |
XX:PermSize | 非堆内存初始值,默认是物理内存的1/64 | |
XX:MaxPermSize | 设置最大非堆内存的大小,默认是物理内存的1/4 |
配置JMX端口监听
为了访问的安全性,需要设置访问密码,也可跳过不配置
### Linux
cp "$JAVA_HOME/jre/lib/management/jmxremote.password.template" "/opt/jmx/jmxremote.password"
cp "$JAVA_HOME/jre/lib/management/jmxremote.access" "/opt/jmx/jmxremote.access"
# 赋予读写的权限 7 4读 2写 1执行
# chmod +x 赋予执行权限
sudo chmod -R 777 /opt/jmx/jmxremote.password
sudo chmod -R 777 /opt/jmx/jmxremote.access
# sudo vim /opt/jmx/jmxremote.password
jmxadmin jmxpwd
# sudo vim /opt/jmx/jmxremote.access
jmxadmin readwrite \
create javax.management.monitor.*,javax.management.timer.* \
unregister
# 启动应用时候配置的参数
nohup java -jar \
-Dcom.sun.management.jmxremote \
-Djava.rmi.server.hostname=x.x.x.x \
-Dcom.sun.management.jmxremote.port=1090 \
-Dcom.sun.management.jmxremote.rmi.port=1090 \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.password.file=/opt/jmx/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=/opt/jmx/jmxremote.access \
-Dspring.profiles.active=test \
/home/locker_server/ineyes-admin.jar > server.log 2>&1 &
启动出问题
Password file read access must be restricted: /opt/jmx/jmxremote.password
解决:
在配置JMX远程访问的时候,设置jmxremote.password文件权限,修改该文件时添加写权限,chmod +w /opt/jmx/jmxremote.password ,放开角色信息那俩行的注释,保存,再使用chmod 0400 /opt/jmx/jmxremote.password
安装visualvm
下载visualvm
点击插件,安装visualgc
![](https://img.haomeiwen.com/i2486135/43c7bc58998b23bf.png)
点击增加远程连接
![](https://img.haomeiwen.com/i2486135/235753b7d9626fee.png)
远程连接默认使用jstatd端口
![](https://img.haomeiwen.com/i2486135/7bba21d451df27d2.png)
这些连接都是基于jstatd基础的
![](https://img.haomeiwen.com/i2486135/3df2c81103ad6b5f.png)
新增的jmx连接需要输入之前设置好的用户名和密码
![](https://img.haomeiwen.com/i2486135/1b59cef62e6f3f1a.png)
安装完毕示意图
![](https://img.haomeiwen.com/i2486135/6af586517f8e412f.png)
注意:
如果连接不上,注意端口是否开放
网友评论