问题背景
最近在使用 JMeter 进行性能测试时,需要使用 ServerAgent-2.2.3 来监控服务器资源。但每次运行脚本时,ServerAgent 就会闪退,无法正常工作。
查看错误日志后,经过一番排查和尝试,我终于找到了解决方案。
今天就把完整的排查过程和三种解决方法分享给大家,希望能帮助到遇到同样问题的朋友。
问题描述
错误现象
在使用 JMeter 的 ServerAgent-2.2.3 监控服务器时:
- 运行脚本时 ServerAgent 立即闪退
- 无法正常启动和监控
错误日志
查看错误日志文件,发现以下关键信息:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000010014ed4, pid=11524, tid=11388
#
# JRE version: Java(TM) SE Runtime Environment (17.0.6+9) (build 17.0.6+9-LTS-190)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (17.0.6+9-LTS-190, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64)
# Problematic frame:
# C [sigar-amd64-winnt.dll+0x14ed4]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
# https://bugreport.java.com/bugreport/crash.jsp
#
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
错误分析
关键信息解读:
-
EXCEPTION_ACCESS_VIOLATION (0xc0000005)
- 内存访问冲突错误
- 程序试图访问无效的内存地址
-
sigar-amd64-winnt.dll+0x14ed4
- 错误发生在
sigar-amd64-winnt.dll这个动态链接库中 - 这是 SIGAR(System Information Gatherer And Reporter)库的 Windows 版本
- 错误发生在
-
JRE version: Java 17.0.6
- 使用的是 Java 17 版本
- ServerAgent-2.2.3 可能不兼容
问题原因
经过分析,问题的根本原因是:ServerAgent-2.2.3 与 JDK 版本不匹配
具体原因:
-
SIGAR 库版本过旧
- ServerAgent-2.2.3 发布时使用的是旧版本的 SIGAR 库
- 旧版本的
sigar-amd64-winnt.dll不兼容新的 JDK
-
JDK 版本过新
- 使用 JDK 17 或更高版本
- 新版 JDK 对本地库的加载和执行有更严格的要求
- 导致与旧版 SIGAR 库冲突
-
log4j 版本冲突
- ServerAgent 自带的 log4j 版本过旧
- 与 JDK 17 的模块化系统不兼容
解决方案
我找到了三种有效的解决方法,按推荐程度排序:
方法一:替换 sigar-amd64-winnt.dll 文件(推荐)
这是最简单直接的解决方法。
步骤 1:下载兼容的 DLL 文件
下载地址:https://files.cnblogs.com/files/5ishare/sigar-amd64-winnt.rar
步骤 2:备份原文件
进入 ServerAgent 安装目录,找到 lib 文件夹:
D:\Program Files\ServerAgent-2.2.3\lib\
备份原有的 sigar-amd64-winnt.dll 文件:
- 重命名为
sigar-amd64-winnt.dll.bak - 或复制到其他位置
步骤 3:替换文件
- 解压下载的压缩包
- 将新的
sigar-amd64-winnt.dll复制到lib目录 - 替换原有文件
方法二:更新 log4j 相关 jar 包
这种方法通过更新日志库来解决兼容性问题。
步骤 1:删除旧版 log4j
在 ServerAgent 安装目录的 lib 文件夹中:
- 找到
log4j.jar文件 - 删除或重命名备份
步骤 2:下载新版 jar 包
需要下载以下三个 jar 包:
-
log4j-1.2.12.jar
-
slf4j-api-1.7.5.jar
-
slf4j-log4j12-1.7.21.jar
步骤 3:添加到 lib 目录
将下载的三个 jar 包复制到 lib 文件夹中。
方法三:使用旧版 JRE(最稳定)
这种方法通过降级 Java 版本来确保兼容性。
步骤 1:下载旧版 JRE
下载 Java 8 或更低版本的 JRE:
- 推荐:Java 8(JRE 1.8.0_xxx)
- 下载地址:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html
步骤 2:创建 jre 文件夹
在 ServerAgent 安装目录下新建一个文件夹,名为 jre:
D:\Program Files\ServerAgent-2.2.3\jre\
步骤 3:解压 JRE
将下载的 JRE 解压到 jre 文件夹中。
步骤 4:修改启动脚本
找到 startAgent.bat 文件(Windows 端),右键编辑:
- Windows 端:
startAgent.bat - Linux 端:
startAgent.sh
在 @echo off 下一行添加:
@echo off
cd /d "D:\Program Files\ServerAgent-2.2.3\jre\bin"
希望这篇详细的解决方案能帮助到你!如果你有其他问题或更好的解决方法,欢迎在评论区交流。
默认评论
Halo系统提供的评论