云服务器线上问题排查JVM诊断调优
2026/9/11 20:04:41 网站建设 项目流程

Java 线上诊断与 JVM 调优实战手册(基于 Arthas + 阿里云 ECS)

1. 环境信息速览

  • 操作系统:Alibaba Cloud Linux (Alinux) / CentOS 兼容
  • Java 版本:目标进程JDK 17.0.8,诊断工具运行环境 JDK 8(兼容)
  • 应用路径/www/wwwroot/xitong/yudao-server.jar
  • 启动用户www(该用户shell/sbin/nologin,无法直接登录)

2. Arthas 安装与环境配置

2.1 下载 Arthas Boot Jar

# 下载到 root 目录curl-Ohttps://arthas.aliyun.com/arthas-boot.jar

2.2 解决跨用户权限问题(关键步骤)

报错现象java.io.IOException: well-known file /tmp/.java_pid695908 is not secure: file should be owned by the current user (which is 0) but is owned by 1001

原因分析:目标 Java 进程由www用户(uid 1001)启动,而当前操作者为root。Linux 出于安全考虑,禁止高权限用户通过ptrace机制直接操作低权限用户的进程。

解决方案:切换到目标进程的所有者(或利用sudo模拟)来执行 Arthas。

# 1. 将 jar 包复制到公共可读目录(避免 /root 目录权限不足)cp/root/arthas-boot.jar /tmp/chownwww:www /tmp/arthas-boot.jar# 2. 以 www 用户身份运行 Arthas(无需登录 shell)sudo-uwwwjava-jar/tmp/arthas-boot.jar

注意:若提示Unable to access jarfile,通常是因为www用户无权限访问/root目录,按上述步骤将 jar 包移出即可。


3. 连接目标进程(Attach)

运行sudo -u www java -jar /tmp/arthas-boot.jar后,终端会列出所有由www用户启动的 Java 进程。

* [1]: 38192 /www/wwwroot/ai-video-chat/aui-ims-robot-0.0.1-SNAPSHOT.jar [2]: 3348167 /www/wwwroot/www.xitong.cn/ms-mcms.jar [6]: 695908 /www/wwwroot/xitong/yudao-server.jar <-- 目标

输入目标进程前的序号(如6)并回车,即可进入 Arthas 交互控制台。

[arthas@695908]$

关于 JDK 版本警告:若出现Current VM java version: 1.8 do not match target VM java version: 17,只要最终显示Attach process 695908 success.,即可忽略该警告,不影响正常使用。


4. JVM 健康度诊断(dashboard 实战分析)

进入控制台后,输入dashboard命令,可获取 JVM 的实时快照数据。如下图:

4.1 线程分析(上半部分)

  • 核心观察指标%CPU列。
  • 健康标准:绝大部分线程%CPU应接近0.00.01
  • 异常信号:若某线程 CPU 占用持续高于80.0,说明存在死循环或极其耗时的计算任务。

4.2 内存与 GC 分析(下半部分)

以下为本次诊断的实际数据(已脱敏),可作为健康基准线参考。

指标数值解读
Heap Usage431M / 2048M (21.08%)堆内存使用率极低,空间充裕
Young GC Count95 次启动约 34 分钟发生 95 次
Young GC Time911 ms平均每次 < 10ms,性能极佳
Full GC Count0 次最理想的状况,无全局停顿
Metaspace Usage191M / 193M (99.26%)此为假象193M是当前已申请空间,并非上限(上限为 -1),会按需自动扩容

诊断结论:当前 JVM极其健康,无需调整-Xmx或垃圾回收器参数。


5. JVM 参数调优实战

5.1 原始启动命令(现状)

/www/server/java/jdk-17.0.8/bin/java-jar\-Xmx2048M-Xms512M\-XX:+HeapDumpOnOutOfMemoryError\/www/wwwroot/xitong/yudao-server.jar\--spring.profiles.active=dev

5.2 推荐改进方案(开启 GC 日志)

在原有基础上,增加-Xlog:gc*用于记录详细的垃圾回收日志,便于未来离线分析。

/www/server/java/jdk-17.0.8/bin/java-jar\-Xmx2048M-Xms2048M\# 建议将初始堆与最大堆设为一致,避免扩容抖动-XX:+HeapDumpOnOutOfMemoryError\-Xlog:gc*:file=/www/wwwroot/xitong/logs/gc.log:time,uptime,level,tags:filecount=5,filesize=100M\-XX:+UseG1GC\# JDK 17 默认即 G1,显式注明仅为规范/www/wwwroot/xitong/logs/gc.log\--spring.profiles.active=dev

5.3 参数修改生效流程

  1. 修改启动脚本(通常是项目目录下的start.sh)。
  2. 优雅关闭旧进程kill -15 PID(等待 Spring Boot 自带优雅停机)。
  3. 执行新脚本sh start.sh
  4. 验证:检查gc.log文件是否正常生成。

6. 四大常见线上故障排查口诀

故障现象常见元凶Arthas 诊断命令应急/解决方案
CPU 飙高 (100%)死循环、正则灾难性回溯thread -n 5查看堆栈定位代码行,增加sleep或优化正则逻辑
内存溢出 (OOM)Map/List 只加不删、ThreadLocal 未移除heapdump /tmp/dump.hprof导出后用MAT分析泄漏链;紧急情况下可用ognl清空爆满的缓存 Map
接口响应变慢SQL 慢查询、第三方 API 延迟、锁竞争trace 类名 方法名定位到具体耗时子方法;SQL 加索引,外部调用改异步
应用卡死/死锁循环等待锁、连接池耗尽thread -b一键定位死锁线程;调整数据库连接池参数

7. 总结:线上诊断三板斧

无论遇到什么线上诡异问题,登陆服务器后执行以下三个步骤,几乎可以解决 90% 的疑难杂症:

  1. 上工具sudo -u www java -jar /tmp/arthas-boot.jar
  2. 看宏观dashboard—— 检查内存水位与 GC 频率。
  3. 抓凶手thread -n 5—— 揪出最耗 CPU 或阻塞的线程堆栈。
    do -u www java -jar /tmp/arthas-boot.jar`
  4. 看宏观dashboard—— 检查内存水位与 GC 频率。
  5. 抓凶手thread -n 5—— 揪出最耗 CPU 或阻塞的线程堆栈。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询