注意:VisualVM连接远程服务器有两种方式:JMX和jstatd,两种方式都不能完美支持所有功能,
例如JMX不支持VisualGC,
jstatd不支持CPU监控,
实际使用可同时配置上并按需选用。
jvisualvm程序添加远程连接,请关闭本机防火墙。
正常的springboot启动命令为
nohup java -jar demo.jar &
使用监控后:
nohup java -Djava.rmi.server.hostname=192.168.81.149 \ -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=1099 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ -jar jvm-1.0-SNAPSHOT.jar &
java -Djava.rmi.server.hostname=192.168.81.149 \ -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=1099 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ -jar jvm-1.0-SNAPSHOT.jar
jvm-1.0-SNAPSHOT.jar 是项目的 jar包
192.168.81.149 是项目部署的机器ip
1099是jvisualvm需要连接的远程端口号
authenticate=false 不启用,用户认证
打开后又可能啥都没有,空荡荡的,这是因为项目需要有人访问下,随便都行
这种方式需要你手动安装JDK才行, 或者你知道jdk在哪里
在jdk目录下的bin创建
vi jstatd.all.policy
我这边指定了绝对路径,方便排除路径方面的影响
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
启动jstatd后台应用 端口(默认为1099) 使用参数-p可指定其它端口
jstatd -J-Djava.security.policy=jstatd.all.policy \ -J-Djava.rmi.server.hostname=192.168.81.149 \ -J-Djava.rmi.server.logCalls=true -p 1098
(我是在/usr/local/jdk1.8.0_161/bin路径下运行的下面的命令,该路径下就有jstatd.all.policy文件。如果是在其他地方执行,记得指定绝对或相对路径)
其中,
-J-Djava.security.policy=jstatd.all.policy 指定路径 -J-Djava.rmi.server.logCalls=true 打印日志 -J-Djava.rmi.server.hostname=192.168.81.149 指定主机名,主机名应该和你用hostname -i命令执行出来的结果一致。
启动项目
java -jar jvm-1.0-SNAPSHOT.jar
这个1,098 其实是我们输入的时候,1098自动转换的
在配置自定义线程池时,如果没有调用`initialize()`方法,程序仍然可以正常运行的原因可能有以下几种: 1. **自动初始化**:某些线程池实现可能在首次使用时自动进行初始化。在这种情况下,即使你没有显式调用`initialize()`方法,线程池也会在需要时自动初始化。 2. **延迟初始化**:有些线程池设计支持延迟初始化,即在第一次提交任务时才进行初始化。如果你的代码在使用线程池之前没有显式调用`initialize()`方法,但随后提交了任务,那么线程池可能会在提交任务时自动初始化。
MySQL订单数据该如何高效划分:三个月内和三个月前?
Kubernetes Filebeat容器日志写入Elasticsearch失败?终极解决指南
Java函数式编程的未来发展
Spring Boot项目有多个启动类,如何指定打包后运行的启动类?
ThreadLocal存储请求上下文数据失效:为什么请求结束修改后数据未更新?