监控工具-jvisualvm.exe-入门,监控tomcat7的jmx、jstatd

1、添加JMX

1.1、catalina-jmx-remote.jar 放在 Tomcat 的 lib 目录下

catalina-jmx-remote.jar 的确切位置可能因 Tomcat 版本和发行版而异,但通常它应该被放置在 Tomcat 的 lib 目录下

 

1.2、catalina.sh设置 JVM 参数

对于 Linux/Unix,编辑 catalina.sh 文件,找到 JAVA_OPTS 或 CATALINA_OPTS 变量并添加如下参数:

export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=your_server_ip"

复制代码
JAVA_OPTS='-Xms600m -Xmx600m -XX:PermSize=128m  -XX:MaxPermSize=256m
           -Dcom.sun.management.jmxremote
           -Dcom.sun.management.jmxremote.port=10001
           -Dcom.sun.management.jmxremote.ssl=false
           -Dcom.sun.management.jmxremote.authenticate=false
           -Djava.rmi.server.hostname=192.168.159.132'
复制代码

参数解释如下:

  • com.sun.management.jmxremote:启用 JMX 远程监控。
  • com.sun.management.jmxremote.port:指定 JMX 代理监听的端口号(这里使用 9010,你可以选择一个不同的端口)。
  • com.sun.management.jmxremote.ssl:设置为 false 以禁用 SSL(如果你想使用 SSL,需要设置为 true 并配置 SSL)。
  • com.sun.management.jmxremote.authenticate:设置为 false 以禁用身份验证(在生产环境中,你可能希望启用身份验证)。
  • java.rmi.server.hostname:指定 JMX 代理监听的 IP 地址(通常设置为你的服务器 IP 地址)

 

1.3、打开jvisualvm.exe

jdk1.8版本,在bin目录下直接有,更高版本需要自行下载,路径:VisualVM: Download

 1.3.1、远程-添加远程主机

 1.3.2、添加JMX连接

 1.3.3、连接成功

 2、添加jstatd

2.1、查看jdk位置

2.1.1、方法一,进到tomcat根目录bin文件夹下,./startup.sh,启动tomcat,看看其使用的jdk的位置

 2.1.2、方法二,进到tomcat根目录bin文件夹下,./version.sh。

 

2.2、修改java.policy配置

对于 Windows 系统:

  • JDK 安装目录:C:\Program Files\Java\jdk<version>\conf\java.policy
  • JRE 安装目录:C:\Program Files\Java\jre<version>\lib\security\java.policy

对于 Linux 和 macOS 系统:

  • JDK 安装目录:/usr/lib/jvm/java-<version>/conf/java.policy
  • JRE 安装目录:/usr/lib/jvm/java-<version>/jre/lib/security/java.policy

打开java.policy,添加如下配置信息

复制代码
grant {
    // 允许所有RMI相关的权限
    permission java.rmi.RemotePermission "*";

    // 允许访问所有类和方法
    permission java.lang.RuntimePermission "accessClassInPackage.sun.misc";
    permission java.lang.RuntimePermission "getClassLoader";
    permission java.lang.RuntimePermission "modifyThread";
    permission java.lang.RuntimePermission "stopThread";

    // 允许网络访问
    permission java.net.SocketPermission "*", "accept,connect,listen,resolve";

    // 允许JVMTI相关的权限(如果需要)
    permission java.lang.management.ManagementPermission "control";
    permission java.lang.RuntimePermission "accessJVMTI";

    // 允许访问系统属性
    permission java.util.PropertyPermission "*", "read,write";

    // 允许加载本地库(如果需要再用,不太安全)
    permission java.security.AllPermission;
};
复制代码

 

2.3、启动jstatd

进入目录

cd /usr/local/jdk1.7.0_80/bin
./jstatd -J-Djava.security.policy=jstatd.all.policy -p 10003 -J-Djava.rmi.server.hostname=192.168.159.132 -J-Djava.rmi.server.logCalls=true

这个命令是用于启动 jstatd(Java Virtual Machine statistics monitoring daemon)的,它是Java的一个工具,用于远程监控JVM的性能统计信息。下面是该命令的详细解释:

  1. ./jstatd: 运行当前目录下的 jstatd 工具。

  2. -J-Djava.security.policy=jstatd.all.policy: 这部分指定了Java的安全策略文件为 jstatd.all.policy。安全策略文件定义了哪些代码可以执行哪些操作。这里的文件名 jstatd.all.policy 可能意味着这个策略文件允许所有操作,但这需要查看文件内容来确定。

  3. -p 10003: 这部分指定了 jstatd 服务监听的端口号为 10003。其他工具(如 jstatjconsole 等)可以通过这个端口远程连接到 jstatd 服务。

  4. -J-Djava.rmi.server.hostname=192.168.159.132: 这部分指定了RMI(Remote Method Invocation)服务器应该使用的主机名或IP地址为 192.168.159.132。RMI是Java的一种远程过程调用机制,jstatd 使用RMI来提供远程接口。

  5. -J-Djava.rmi.server.logCalls=true: 这部分启用了RMI服务器上的方法调用日志记录。当这个选项被设置为 true 时,RMI服务器会记录每个远程方法调用的详细信息,这对于调试和性能分析非常有帮助。

总的来说,这个命令启动了一个 jstatd 服务,该服务使用 jstatd.all.policy 作为安全策略文件,监听在端口 10003,绑定到IP地址 192.168.159.132,并且启用了方法调用日志记录。其他工具可以通过这个端口和IP地址连接到这个 jstatd 服务,以获取JVM的统计信息。

 

2.4、添加jstatd连接

 2.5、添加Visual GC插件

 3、调优

3.1、GC调优

如果满足下面的指标,则一般不需要进行GC调优:
Minor GC执行时间不到50ms;
Minor GC执行不频繁,约10秒一次;
Full GC执行时间不到1s;
Full GC执行频率不算频繁,不低于10分钟1次。

GC的调优方向有以下几点:

减少创建对象的数量 。对象创建及回收都会占用系统资源,减少对象创建的数量可以降低GC的压力。
减少使用全局变量和大对象 。全局变量和大对象会长期占用内存,导致老年代内存占用增长过快,触发Full GC的概率增大。
根据实际应用场景确定调优目标 。例如,GC停顿时间不能大于200ms,同时吞吐量不能低于每秒1万次请求。
分析JVM中GC的状态,定位问题原因 。可以通过jstat等JVM监控工具、GC日志、操作系统诊断工具等获取JVM相关信息。
根据实际情况调整相关JVM参数或其它软硬件配置 。例如,调整堆内存大小、调整线程数等。

 

3.2、线程死锁调优

JMX可监测到死锁,点击线程Dump,可查到具体报错行数

 

cd /usr/local/web/WebRoot/WEB-INF/classes/这个目录里的config.properties 最后一行JTEST=1,可以模拟有死锁BUG的情况,会被visualvm监测到 改成JTEST=0,可以模拟BUG已修复的情况,不会出现死锁

posted @ 2024-03-26 22:24  亲爱的暖暖  阅读(65)  评论(0)    收藏  举报