线上定时采集性能火焰图,每次跑完进程物理内存固定上涨 70M 且不会自动回落;重复采集内存不再增长,重启服务后重新采集又会复现内存占用上涨。
排查 GC、业务代码、JVM 参数、中间件连接池全部无异常,问题潜伏很久无人定位根因。
复现验证后找到核心漏洞:自动化脚本仅停止 profiler 采样,未执行 stop 卸载 Arthas Agent,注入的代理组件常驻 JVM,内存无法释放。
本文还原故障、拆解 Arthas Attach 底层原理、UDS 通信与信号唤醒机制,附带精简无业务标识脚本,吃透诊断工具底层 JVM 细节。
# 采集参数
serviceTag=$1
collectDuration=60
# 获取Java进程PID
PID=$(ps aux | grep spring.application.name | grep -v grep | awk '{print $2}')
[ -z "$PID" ] && exit 1
# 自动拉取Arthas启动脚本
[ ! -f ./as.sh ] && curl -O xxxx/as.sh -s
chmod +x ./as.sh
# 开启性能采样
./as.sh -c "profiler start" $PID
sleep $collectDuration
# 停止采样,导出火焰图
cmdOutput=$(./as.sh -c "profiler stop --format html" $PID)
flameFile=$(echo "$cmdOutput" | grep -oP '(?<=file: ).*\.html')
# 重命名图表
mv $flameFile ${serviceTag}_flame.html致命缺陷:仅关闭性能采样器,缺少stop卸载 Agent 指令。
手动分步测试:
profiler start+profiler stop后直接退出;./as.sh -c "stop" $PID,Agent 完整卸载,内存回落。stop 执行输出佐证:
Resetting all enhanced classes ...
Affect(class count:0,method count:0) cost in 1 ms, listenerId:0
Arthas Server is going to shutdown...依托 JDK Attach API + Instrumentation 动态注入,4 步流程:
VirtualMachine.attach(PID) 发起连接;arthas-agent.jar,运行agentmain启动常驻服务;profiler stop只关闭采样功能,Agent 主体常驻;仅stop命令会完整卸载所有组件。
/tmp/.java_pid{PID}文件通信,不走 TCP/IP;套接字文件、Agent 资源不会随客户端脚本自动清理,仅同系统用户可访问。.attach_pid{PID}标记文件,发送SIGQUIT;kill -3仅打印线程栈,不会注入 Agent。表格
特性 | Unix Domain Socket(Arthas) | 普通 TCP Socket |
|---|---|---|
寻址 | 本地文件路径 | IP + 端口 |
范围 | 仅本机 | 跨机器 |
协议栈 | 无 TCP/IP,性能更高 | 完整 TCP 协议栈 |
资源回收 | 文件不会自动删除 | 连接断开自动释放端口 |
属于 JDK 官方标准诊断接口,非后门:
# 开启采样
./as.sh -c "profiler start" $PID
sleep $collectDuration
# 停止采样导出图表
cmdOutput=$(./as.sh -c "profiler stop --format html" $PID)
flameFile=$(echo "$cmdOutput" | grep -oP '(?<=file: ).*\.html')
# 新增关键代码:卸载Agent,释放70M常驻内存
./as.sh -c "stop" $PID
mv $flameFile ${serviceTag}_flame.htmlprofiler stop + stop,缺 stop 会造成 Agent 常驻、内存永久占用;大量线上隐性内存上涨故障,根源并非业务代码,而是自动化诊断工具遗漏资源释放逻辑。
多数研发、运维只会复制 Arthas 采集脚本,不了解 Attach 注入、Agent 生命周期、UDS 底层通信,每次采集都会给业务进程埋下隐形内存隐患。
吃透 JDK 官方 Attach 底层机制、信号唤醒、Agent 完整生命周期,才能写出无残留、安全可靠的自动化诊断脚本,彻底规避火焰图、trace、watch 等工具带来的内存占用问题。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。