最近在学习 JVM,其中涉及到性能、内存等指标分析需要使用工具分享,Java 提供了几个可视化工具来监控和管理 Java 应用,比如 Jconsole、JVisual、JMC,他们以图形化的界面实时的监控程序各种性能指标以及内存、CPU 的使用情况。

Jconsole、JVisual、JMC 可视化工具,调用本地监控直接使用对应的命令行即可,但 Linux 无法使用可视化工具,Java 程序基本都部署到 Linux 服务器。需要本地远程调用服务器,本文记录一下远程调用的一些步骤和遇到的坑。

JMX

JXM(Java Management Extensions) 是 Java 提供的一套标准 API,用于管理和监控 Java 应用程序的各种性能指标和使用情况。这里主要使用远程访问的功能。

JMX 启动参数:

  • -Dcom.sun.management.jmxremote 远程开启开关
  • -Dcom.sun.management.jmxremote.port=1808 jmx远程调用端口
  • -Dcom.sun.management.jmxremote.authenticate=false 不开启验证
  • -Dcom.sun.management.jmxremote.ssl=false 不为ssl连接
  • -Djava.rmi.server.hostname=34.126.141.21 服务器所在ip或者域名

配置远程连接

启动 Java 程序一般有两种方式:

  • 一是打成 jar 包,使用 java -jar 运行程序。
  • 一种是打成 war 包,放在 tomcat 上运行。

无论是 jar 还是 war 包,都是将上面的配置参数用空格拼接起来,比如将上面的参数拼接:

Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=18088 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=34.126.141.21

添加到配置文件或者启动参数中。

Java 程序启动

jar 包程序启动一般为:

java -jar xxx.jar

添加参数后:

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1808 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=34.126.141.21 -jar xxx.jar

tomcat 启动

在启动文件 catalina.sh 里面添加:

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1808 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=34.126.141.21"

添加上面的配置之后,重启 tomcat,再使用 Jconsole 远程连接

使用 jconsole 远程连接,一直连接不上

无法远程问题排查

先查看本地端口是否开启:

netstat -ntlp

端口已开启:

tcp6     0     0 :::1808          :::*              LISTEN      9087/java

再查看是否是防火墙问题,使用端口扫描查看,端口也开启了:

端口开启了,但是还是无法连接

找了很多网上的答案,大家都是抄来抄去的,都是上面的配置。最后才发现少了 rmi 配置。

解决方案

添加 rmi 端口:

-Dcom.sun.management.jmxremote.rmi.port=1808

JMX 和 RMI,是两种相关联的技术,JMX 使用 RMI 作为远程管理工具来管理和监控 Java 程序,RMI 为 JMX 提供了远程连接所需的远程调用和通信机制。

添加了上面的配置,就能远程监控 Java 服务了。

关闭 tomcat 报错

tomcat 启动添加了配置之后,关闭 tomcat 服务时,就报错了:

sun.management.AgentConfigurationError: java.rmi.server.ExportException: Port already in use: 18088; nested exception is:
java.net.BindException: Address already in use (Bind failed)
at sun.management.jmxremote.ConnectorBootstrap.exportMBeanServer(ConnectorBootstrap.java:800)
at sun.management.jmxremote.ConnectorBootstrap.startRemoteConnectorServer(ConnectorBootstrap.java:468)
at sun.management.Agent.startAgent(Agent.java:262)
at sun.management.Agent.startAgent(Agent.java:452)
Caused by: java.rmi.server.ExportException: Port already in use: 18088; nested exception is:
java.net.BindException: Address already in use (Bind failed)
at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:346)
at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:254)
at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:412)
at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:147)
at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:237)
at sun.management.jmxremote.ConnectorBootstrap$PermanentExporter.exportObject(ConnectorBootstrap.java:199)
at javax.management.remote.rmi.RMIJRMPServerImpl.export(RMIJRMPServerImpl.java:146)
at javax.management.remote.rmi.RMIJRMPServerImpl.export(RMIJRMPServerImpl.java:122)
at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:404)
at sun.management.jmxremote.ConnectorBootstrap.exportMBeanServer(ConnectorBootstrap.java:796)

简单就是端口被占用了,又去网上搜了很多答案,汇总了两个解决方法:

  • 把 catalina.sh 添加的配置删掉
  • 使用 kill -9 的命令直接杀掉进程

这两种方案都是治标不治本的方法,每次都要做多一点的操作,就显得很繁琐。

问题分析

无论使用 startup.sh 启动 tomcat 还是使用 shutdown.sh 关闭 tomcat 都会执行 catalina.sh 脚本,所以关闭 tomcat 也会启动端口,而启动 tomcat 的时候已经开启了端口,关闭的时候再开启就报错了。

问题解决

只在启动 tomcat 时添加 jmx 相关的配置,在 catalina.sh 添加判断条件 if [ "$1" = "start" ]

if [ "$1" = "start" ] ; then
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=18088 -Dcom.sun.management.jmxremote.rmi.port=18088 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=34.126.141.211"
fi

总结

  • 网上都是相互抄来抄去的,都是缺少 RMI 配置,完整配置如下

    • JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1808 -Dcom.sun.management.jmxremote.rmi.port=1808 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=34.126.141.21"
  • JMX 是一套标准 API,用于管理和监控 Java 应用程序。而 RMI 为 JMX 提供了远程连接。
  • 关闭的报错的解决方案也是互相抄来抄去,解决方案都是治标不治本。在配置上面添加 if 判断条件 添加判断条件 if [ "$1" = "start" ]。

Jconsole 开启远程连接遇到的一些坑的更多相关文章

  1. SQLServer2008设置 开启远程连接

    SQLServer2008设置 开启远程连接 前一段时间,学生分组做项目,使用SVN工具,要求功能使用存储过程,在数据库这块出现这么一个问题: A学生在他的数据库上添加了存储过程,需要其他的B,C,D ...

  2. (转)MySql开启远程连接权限

    命令行登陆: mysql -u root -p 不行的话可以从MySql.exe进入,找到Mysql根目录中路径类似:"MySQL\bin\mysql.exe",这样: D:\We ...

  3. 远程连接mysql,mysql如何开启远程连接

    很多时候,mysql只需要开本地连接,也就是本机(服务器本身)连接就可以,默认也是这样,默认也不支持远程连接 但有的时候,我们需要将mysql独立出一台主机或数据库,放到另一台机器的时候,这时,就需要 ...

  4. mysql如何开启远程连接

    链接地址:http://jingyan.baidu.com/article/046a7b3ed85f3ef9c27fa9dc.html 大家在公司工作中,经常会遇到mysql数据库存储于某个人的电脑上 ...

  5. Ubuntu开启远程连接

    Ubuntu开启远程连接 author:headsen chen   2017-10-13   09:47:38 个人原创,严禁转载,违者追究法律责任: apt-get update apt-get ...

  6. JConsole/JvisualVM 远程连接失败处理

    今天在使用JConsole进行远程连接时,发现IP和端口在Windows下是可以远程telnet的,但是,使用JConsole时却无法连接. 我的环境如下: Windows下运行JConsole,准备 ...

  7. MySQL开启远程连接权限

    对于我们刚开始安装的mysql或者mariadb来说,默认是不开启远程连接的.所以需要我们手动开启远程连接的权限.如果你是使用docker安装mysql那需要先进入容器中,这里就不讲如何进入容器了,百 ...

  8. Windows提权与开启远程连接

    1.提权: 建立普通用户:net user 帐户 密码 /add 提权成管理员:net localgroup administrators 帐户 /add 更改用户密码:net user 帐户 密码 ...

  9. MySQL开启远程连接的方法

    默认情况下,mysql只允许本地登录,如果要开启远程连接,则需要修改/etc/mysql/my.conf文件. 一.修改/etc/mysql/my.conf找到bind-address = 127.0 ...

  10. mysql开启远程连接及本地连接

    问题描述 在本机windows上连接linux服务器上的mysql报错:host'XXX' is not allowed to connect to this mysql server. 这个错误是由 ...

随机推荐

  1. JavaScript中计时器requestAnimationFrame、setTimeout、setInterval、setImmediate的使用和区别

    在JavaScript中,我们经常使用requestAnimationFrame.setTimeout.setInterval和setImmediate来控制代码的执行时机.它们各有特点和适用场景: ...

  2. 系统论——复杂适应系统CAS(三)

    美国的圣塔菲研究所一直是复杂性研究的中心.1994年,约翰·霍兰德在圣菲研究所举办的吴拉姆纪念讲座中做了名为"隐秩序"的著名演进,而后,出版了<隐秩序-适应性造就复杂性> ...

  3. 创建用户认证授权的 kubeconfig 文件

    创建用户认证授权的 kubeconfig 文件 当我们安装好集群后,如果想要把 kubectl 命令交给用户使用,就不得不对用户的身份进行认证和对其权限做出限制. 下面以创建一个 cby 用户并将其绑 ...

  4. Archlinux最新安装教程

    介绍 Arch Linux(或 Arch /ˈɑːrtʃ/))是一款基于 x86-64 架构的 Linux发行版 .系统主要由自由和开源软件组成,支持社区参与.系统设计以 KISS原则(保持简单和愚蠢 ...

  5. 四月八号java基础

    1.复合语句:JAVA语言不允许在两个嵌套的复合语句内声明同样的变量 2.注释:1)单行注释// 2)多行注释/*......*/3)/**......*/文件注释 3.else总是与之最近的if结构 ...

  6. Carla 自动驾驶仿真平台的安装与配置指南

    简介 Carla 是一款基于 Python 编写和 UE(虚幻引擎)的开源仿真器,用于模拟自动驾驶车辆在不同场景下的行为和决策.它提供了高度可定制和可扩展的驾驶环境,包括城市.高速公路和农村道路等.C ...

  7. 最新升级优化 shopee|美客多 Mercadolibre|shopfiy|lazada|独立货代贴单系统 可规模化的贴单打单系统 源码下载独立部署

    七想网络 跨境猴 最新优化改进版本的 虾皮代打包-虾皮代贴单 独立部署源码版本货代贴单系统 介绍: 台湾海外仓_shopee货代_虾皮物流–虾皮代贴单 虾皮代打包-虾皮代贴单-虾皮货代平台 shope ...

  8. 谈谈selenium中的clear后输入内容异常的处理

    谈谈selenium中的clear后输入内容异常的处理 案例 在线考试项目的登录:http://124.223.31.21:9097/#/ 代码 from selenium import webdri ...

  9. css实现文本溢出省略号

    CSS常用属性: overflow:hidden; //超出的文本隐藏 text-overflow:ellipsis; //溢出用省略号显示 white-space:nowrap; //溢出不换行,只 ...

  10. RedisTemplate在拦截器前没有注入的问题

    RedisTemplate为null的问题 最近在搭建一个项目,然后项目框架采用的是spring boot,然后登录我就使用新学习的JWT嘛,然后就想着在请求进来的时候使用拦截器先对传进来的token ...