VisualVM连接远程Java进程

VisualVM连接远程Java进程

JMX方式

配置脚本文件

$CATALINA_HOME/bin/startup.sh 倒数第二行(也就是exec "$PRGDIR"/"$EXECUTABLE" start "$@"一行上边)写入下面的内容:

export CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=*.*.*.* YOUR SERVER IP
-Dcom.sun.management.jmxremote.port=7003
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access"

或者编辑Tomact里bin目录的catalina.sh . 在其头部加入(推荐)

JAVA_OPTS="
   -Dcom.sun.management.jmxremote
   -Dcom.sun.management.jmxremote.port=8998  这个端口可以改
   -Dcom.sun.management.jmxremote.rmi.port=8998
   -Dcom.sun.management.jmxremote.ssl=false
   -Dcom.sun.management.jmxremote.authenticate=ture 需要鉴权 若为false则不需要下两行的配置
   -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access
-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx" 服务器ip地址 

参数说明

-Dcom.sun.management.jmxremote 启用JMX远程监控
-Djava.rmi.server.hostname=*.*.*.* 你的tomcat服务器IP地址
-Dcom.sun.management.jmxremote.port=7003  jmx连接端口
-Dcom.sun.management.jmxremote.ssl=false  是否ssl加密
-Dcom.sun.management.jmxremote.authenticate=true  远程连接需要密码认证
-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password  指定连接的用户名和密码配置文件
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access  指定连接的用户所拥有权限的配置文件

编辑Tomcat里conf目录的server.xml 加入监听器:

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="8998" rmiServerPortPlatform="8999" />

  • 其中8998可以改为你想要的端口

创建账号密码和权限配置文件

jmxremote.access

进入在 $CATALINA_HOME/conf/ 目录下

创建touch jmxremote.access里添加可以连接监控的用户名以及权限:
文件内容如下:

monitorRole readonly
controlRole readwrite
jmxremote.password

touch jmxremote.password 创建存储账号密码的文件
写入下面内容:

monitorRole 111111
controlRole 222222

修改访问权限

修改jmxremote.access和jmxremote.password的权限:

sudo chmod 600 jmx*

然后, 开放端口,重启Tomcat使之生效。

jstatd方式

新建配置文件

使用cd $JAVA_HOME 到jdk的根目录,bin文件夹里面新建jstatd.all.policy文件。内容如下:

grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };

启动配置文件

在服务器上jstatd.all.policy所在目录下执行下面的命令
其中 /usr/local/java/bin/jstatd为jstatd所在路径,为${JAVA_HOME}/bin/jstatd,在bin目录下启动Jstatd。

./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.0.23

hostname为外网ip。

默认使用1099端口,如果想指定端口使用如下命令:

jstatd -J-Djava.security.policy=jstatd.policy -p 1099

jstatd 的安全问题

jstatd服务只能监视具有适当的本地访问权限的JVM,因此jstatd进程与被监控的JVM必须运行在相同的用户权限中。但是有一些特殊的用户权限,如基于UNIX(TM)为系统的root用户,它有权限访问系统中所有JVM的资源,如果jstatd进程运行在这种权限中,那么它可以监视系统中的所有JVM,但是这也带来了额外的安全问题。

jstatd服务不会对客户端进行任何的验证,因此运行了jstatd服务的JVMs,网络上的任何用户的都具有访问权限,这种暴露不是我们所希望的,因此在启动jstatd之前本地安全策略必须要加以考虑,特别是在生产环境中或者是在不安全的网络环境中。

如果没有其他安全管理器被安装,jstatd服务将会安装一个RMISecurityPolicy的实例,因此需要在一个安全策略文件中指定,该策略文件必须符合的默认策略实施的策略文件语法。

下面的这个示例策略将允许jstatd服务具有JVM全部的访问权限:

grant codebase "file:${java.home}/../lib/tools.jar" {  
   permission java.security.AllPermission;  
}; 

注:此处策略中的java.home,和JAVA_HOME不是一个概念,不要搞错了,此处的java.home指的是JRE的路径,这个是Java的系统属性,不需要手工指定,通常是这个jdk下面的jre路径,即可以认为 j a v a . h o m e 和 {java.home}和 java.home{JAVA_HOME}/jre是等价,如果想查看这个变量的值,可以任意找一个运行着的Java应用,找到它的PID,然后通过如下jinfo命令查看就可以查看到java.home的值:

jinfo ${PID}|grep java.home

其他

无法访问

这个时候理论上可以开启visualVM然后添加远程主机监控了,但是由于JMX和jstatd还需要监听一到两个随机端口。会有报错信息:无法使用service:jmx:rmi连接,通常解决方法有两种:

  • 是用 jps 得到pid,然后使用 lsof -i|grep {pid} 命令得到监听的其他端口然后将在iptables开放。
  • 关闭防火墙

Jar包监控

执行jar启动命令

java -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar foo.jar

说明

  • 12345为需要监控的端口,远程机器需要开启

  • foo.jar为程序名称

出现VisualVM 无法使用 service:jmx:rmi:///jndi/rmi:///jmxrmi 连接情况,关闭远程机器的防火墙即可

原因是除了JMX server指定的监听端口号外,JMXserver还会监听一到两个随机端口号,
可以通过命grep 来查看当前java进程需要监听的随机端口号

远程连接启动authenticate、ssl参数

以authenticate设置为例

  1. jmx连接使用安全凭证,这里的凭证不是linux的登录账号密码,需要单独设置

  2. jmxremote.access内容

    admin readwrite
    
  3. jmxremote.password内容

    admin 123456
    
  4. 两个文件授权(必须按下面方式授权,chmod777都不行)

    chmod 600 jmxremote.access
    chmod 600 jmxremote.password
    
    chown root:root jmxremote.access
    chown root:root jmxremote.password
    
  5. jar程序启动命令

    java -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.access.file=/usr/local/jmxremote.access -Dcom.sun.management.jmxremote.password.file=/usr/local/jmxremote.password -jar foo.jar
    
### 如何配置 VisualVM 连接远程 JVM 为了使 VisualVM 成功连接远程 JVM 并对其进行监控,需完成若干必要的设置步骤。这不仅涉及目标机器上的 Java 应用程序启动参数调整,还可能涉及到防火墙规则的适当放宽以便允许所需的通信端口通过。 #### 配置 JMX 服务用于远程访问 当准备让 VisualVM 访问位于另一台计算机上的 JVM 实例时,首要任务是在该远端服务器上正确地配置 JMX(Java Management Extensions)。此过程通常意味着要编辑 JDK 安装路径下 `/jre/lib/management` 文件夹内的 `jmxremote.password.template` 文件并将其重命名为 `jmxremote.password` 同时移除特定角色定义前的注释标记[^5]。对于 Unix 类操作系统而言,还需确保这两个文件拥有恰当的安全属性: ```bash chmod 600 jmxremote.access jmxremote.password ``` #### 设置 JVM 参数支持远程调试 为了让运行中的 Java 程序能够被外部工具所监测,在启动命令里加入一系列专门针对 JMX 的 JVM 参 数 是 必 不可少的一环。下面是一组推荐使用的选项列表,它们应附加于 `-Dcom.sun.management.jmxremote.port=port_number` 开头的相关指令之后: - `-Dcom.sun.management.jmxremote.authenticate=true/false`: 控制是否启用身份验证机制,默认情况下为 true。 - `-Dcom.sun.management.jmxremote.ssl=false`: 关闭 SSL 加密传输层协议的支持,除非有特殊安全需求否则一般设为 false。 - `-Djava.rmi.server.hostname=<hostname>`: 明确指定 RMI 服务注册表所在的主机名或 IP 地址,这对于 NAT 或者多网卡环境特别有用。 例如,完整的 JVM 启动参数可以像这样构建: ```shell -Dcom.sun.management.jmxremote.port=9999 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ -Djava.rmi.server.hostname=localhost ``` 请注意,出于安全性考虑,建议仅在受控网络环境中禁用认证和SSL加密。 #### 添加远程主机到 VisualVM 中 一旦上述准备工作全部就绪,则可以在本地电脑打开 VisualVM,并按照如下方式添加新的远程主机条目: 1. 在主界面左侧的应用程序窗口中点击右键菜单选择 "Add Remote Host..."; 2. 输入远程主机的名字或IP地址后确认添加; 3. 接着可以通过双击新建立的节点展开查看可用的服务进程列表,或者手动输入 PID 来直接关联某个具体的 JVM 实例。 此时应该就能看到来自远方系统的各项指标数据了,从而便于进一步开展性能调优工作或是故障诊断活动。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值