java visualVM(jconsole)远程监控服务器java进程

JMX方式(jconsole也可通过此方式进行连接)

  jmx方式能监控到CPU信息,但无法使用visualVM的visualVM GC插件

jmx无密码方式

监控普通的java进程

  1. 设置hostname
      在/etc/hosts中添加hostname解析,解析地址可以不是外网ip(可通过hostname命令查看hostname是多少)
  2. 启动时添加参数
    java -Djava.rmi.server.hostname=xxx.xxx.xxx 
            -Dcom.sun.management.jmxremote.port=22334 
            -Dcom.sun.management.jmxremote.authenticate=false 
            -Dcom.sun.management.jmxremote.ssl=false Hello
      其中xxx.xxx.xxx为本机外网ip,22334为提供jmx访问的端口,可自己指定
      如果没有配置hostname解析可能会出现如下异常:
    Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException:
    nohup java -Xms64m -Xmx128m 
            -Djava.rmi.server.hostname=10.211.55.81 
            -Dcom.sun.management.jmxremote 
            -Dcom.sun.management.jmxremote.port=22334 
            -Dcom.sun.management.jmxremote.rmi.port=22335 
            -Dcom.sun.management.jmxremote.authenticate=false 
            -Dcom.sun.management.jmxremote.ssl=false 
            -Dserver.port=9091 -jar mybatisplus.jar  1>/dev/null 2>&1 &
  3. 在防火墙中开放端口
    lsof -i | grep java | grep “启动的java进程pid”(可通过jps查看) 
      将查看上一步查看到的tcp监听端口全部在防火墙中进行开放,注意关闭该java进程后重新启动需要重新配置开发的端口,因为监听的端口会发生变化
  4. 打开visualVmjconsole
      输入ip2中配置的xxx.xxx.xxx)和端口(22334)进行连接即可查看监控,无需输入用户名和密码

监控普通的tomcat

  1. 下载catalina-jmx-remote.jar,放在tomcat/lib目录下面
      请根据自己的tomcat版本选择对应的包:
      地址示例: http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.35/bin/extras/
      地址示例: http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.35/bin/extras/
      下载地址: http://mvnrepository.com/artifact/org.apache.tomcat/tomcat-catalina-jmx-remote
  2. 配置conf/server.xml
      在server.xml中添加如下监听配置:
    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"  
           rmiRegistryPortPlatform="22334" rmiServerPortPlatform="22334" />
      有了该可使得每次重启tomat不需要重新在防火墙中开放端口,因为会使用配置的22334端口
  3. 修改bin/catalina.shbin/setenv.sh
      添加配置:
    CATALINA_OPTS="${CATALINA_OPTS} -Djava.rmi.server.hostname=服务器的外网ip地址"                                                                                                                                                                                                      
    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote=true"
    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.ssl=false"
    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.authenticate=false"
  4. 在防火墙中开放端口
      在防火墙中开发22334端口
    firewall-cmd --zone=public --add-port=22334/tcp --permanent
  5. 打开visualVmjconsole
      输入ip3中配置的服务器的外网ip地址)和端口(22334)进行连接即可查看监控,无需输入用户名和密码

jmx有密码方式

  1. 添加账号
      进入/usr/java/jdk1.8.0_321-amd64/jre/lib/management/目录(可通过jinfo pid|grep java.home的查看自己的java.home
      执行命令:
    cp jmxremote.password.template jmxremote.password
    chmod 600 jmxremote.password
    vim jmxremote.password
    
    # 将被注释的monitorRole,和controlRole放开,并修改密码123456
    monitorRole  123456
    controlRole  123456
      
      进入/tomcat/conf/目录
    vi jmxremote.access
    username  readwrite
    
    vi jmxremote.password
    username password
    
    chmod 600 jmxremote.access
    chmod 600 jmxremote.password
  2. 修改之前的启动配置
    #CATALINA_OPTS
    CATALINA_OPTS="$CATALINA_OPTS -Djava.awt.headless=true"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=22334"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.rmi.port=22335"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=true"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access"
    CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=10.211.55.81"
    export CATALINA_OPTS
      
    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=8998"
    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=8998"
    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=ture"
    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password"
    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access"
    JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=10.211.55.81"
  3. 启动
      打开visualVmjconsole输入ip+端口,然后输入之前设置的账号controlRole 和密码 123456即可连上

jstatd方式

  jstatd方式能使用visualVM的visualVM GC插件,但无法监控到CPU信息

  1. 开启权限
      在/usr/java/jdk1.8.0_321-amd64/jre/lib/security/java.policy中添加
    permission java.security.AllPermission;
  2. 启动
    rmiregistry 2020&jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true 
            -J-Djava.rmi.server.hostname=服务器外网ip -p 1099
  3. 开放端口
      通过netstat -ntlp|grep jstatd查看监听的端口(注意有两个监听端口),在防火墙中进行开放该端口
    如果出现:java.rmi.NotBoundException: JStatRemoteHost
    一般等一段时间就恢复正常了
  4. 打开visualVm添加远程主机会自动加载远程java进程

PS

  1. setenv.sh
    vi setenv.sh
    chmod +x setenv.sh
    chmod 600 jmxremote.password
    chmod 600 jxmremote.access
  2. java.rmi.server.ExportException: internal error: ObjID already in use
      把文件server.xml中的下面删除即可。
    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"  
     rmiRegistryPortPlatform="8998" rmiServerPortPlatform="8999"/>
  3. Mac 下 java 的路径:
    /usr/libexec/java_home -V

参考
visualVM使用jstatd和jmx连接远程jvm及遇到的问题解决
visualvm远程连接配置
visualvm 下载
visualvm 插件