VisualVM【实践 02】远程JVM监控的JMX配置及No supported for this JVM问题处理(Jstatd报错踩坑不计其数)

简介: VisualVM【实践 02】远程JVM监控的JMX配置及No supported for this JVM问题处理(Jstatd报错踩坑不计其数)

1.远程JVM监控

【实践 01】简单介绍了 VisualJVM 监控本地 JVM GC 的使用,部分项目是部署在服务器的,远程监控怎么实现呢?需要借助于 JMX 技术实现。

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。它可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。

1.1 监控远程Tomcat

参数说明:

  • -Dcom.sun.management.jmxremote【开启JMX远程监控】
  • -Dcom.sun.management.jmxremote.port=18080【JMX远程连接端口】
  • -Dcom.sun.management.jmxremote.local.only=false【是否仅本机】
  • -Dcom.sun.management.jmxremote.authenticate=false【不进行认证】
  • -Dcom.sun.management.jmxremote.ssl=false 【不适用SSL】
# 修改tomcat的bin目录下catalina.sh 文件添加如下的参数(为了方便查看这里进行了换行)
JAVA_OPTS="
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=18080 
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false"

没有部署在Tomcat里的项目,这里待补充…

1.2 远程监控Jar

1.2.1 jar包启动
# 阿尔萨斯的一个jar包,很小。
curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar
nohup java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=18080 \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=tcloud \
-jar math-game.jar \
> math-game.log 2>&1 &
1.2.2 远程 Host 和 JMX Connection 添加

端口号要与Dcom.sun.management.jmxremote.port保持一致:

1.2.3 端口放开

添加后发现远程监控的服务并未上线:

# 1.查询进行号
[root@tcloud ~]# jps -l
11698 sun.tools.jps.Jps
7190 math-game.jar
# 2.查询进程绑定的所有端口
[root@tcloud ~]# lsof -i | grep 145546
java       7190     root   15u  IPv6 43969808      0t0  TCP *:46447 (LISTEN)
java       7190     root   16u  IPv6 43969809      0t0  TCP *:18080 (LISTEN)

由于是云服务器,需要通过配置安全组放开1808046447端口,放开后远程监控自动连接:

2.No supported for this JVM问题处理

在想要查看 Visual GC 时发现 No supported for this JVM. 的提示:

一头雾水啊,难道是 JDK 是 OpenJDK 的缘故吗?参考 [回答5] 处理了这个问题:

# 使用 jstatd 命令时报没有权限
[root@tcloud ~]# jstatd
Could not create remote object
access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
        at java.security.AccessController.checkPermission(AccessController.java:886)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
        at java.lang.System.setProperty(System.java:792)
        at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)
# 1.查看JAVA_HOME
[root@tcloud opt]# echo $JAVA_HOME
/usr/local/java/jdk1.8.0_241
# 2.添加文件
vim ${JAVA_HOME}/jstatd.all.policy
  # 错误示范
  grant codebase "file:${JAVA_HOME}/lib/tools.jar" {
      permission java.security.AllPermission;
  };
  grant codebase "file:${JAVA_HOME}/../lib/tools.jar" {
      permission java.security.AllPermission;
  };
  # 添加内容两种都行
  grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
  };
  grant codebase "file:/usr/local/java/jdk1.8.0_241/lib/tools.jar" {
      permission java.security.AllPermission;
  };
# 3.启动 jstatd 代理(不报错说明启动成功)如果使用默认端口可不添加 -p
# 测试时可以开启调用日志
-J-Djava.rmi.server.logCalls=true
jstatd -J-Djava.security.policy=${JAVA_HOME}/jstatd.all.policy \
-J-Djava.rmi.server.hostname=tcloud \
-J-Djava.net.preferIPv4Stack=true \
-p 1099 &
# 4.服务启动(需要注意)依然要配置 JMX 否则无法查看 CPU 信息并且要注意 JMX 配置的 hostname 与 Jstatd 一致。 
nohup java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=18080 \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=tcloud \
-jar math-game.jar \
> math-game.log 2>&1 &

启动Jstatd后会有一个Jstatd的连接,启动服务后会再有一个服务的连接,此时的服务连接与之前的JMX连接是一样的,之前的JMX连接也能够查看GC数据了:

3.VisualVM总结

  • 可视化的工具很实用。
  • jstatd报错踩坑有些多。
目录
相关文章
|
4月前
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
417 3
|
26天前
|
Arthas 监控 数据可视化
JVM进阶调优系列(7)JVM调优监控必备命令、工具集合|实用干货
本文介绍了JVM调优监控命令及其应用,包括JDK自带工具如jps、jinfo、jstat、jstack、jmap、jhat等,以及第三方工具如Arthas、GCeasy、MAT、GCViewer等。通过这些工具,可以有效监控和优化JVM性能,解决内存泄漏、线程死锁等问题,提高系统稳定性。文章还提供了详细的命令示例和应用场景,帮助读者更好地理解和使用这些工具。
|
1月前
|
Java Android开发 开发者
【编程进阶知识】精细调控:掌握Eclipse JVM参数配置的艺术
本文详细介绍了如何在Eclipse中配置JVM参数,包括内存的初始和最大值设置。通过具体步骤和截图演示,帮助开发者掌握JVM参数的精细调控,以适应不同的开发和测试需求。
41 1
|
3月前
|
Java
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
|
4月前
|
存储 Java
java 服务 JVM 参数设置配置
java 服务 JVM 参数设置配置
149 3
|
4月前
|
安全 Java fastjson
JVM 配置参数 -D,-X,-XX 的区别
JVM 配置参数 -D,-X,-XX 的区别
80 2
|
4月前
|
Java Serverless 应用服务中间件
函数计算操作报错合集之JVM启动时找不到指定的日志目录,该如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
1月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
37 4
|
9天前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
6天前
|
Java Linux Windows
JVM内存
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制。
8 1