Arthas 实战指南:从方法耗时定位到 JVM 变量热修改
一、观察方法耗时——trace / stack1.1 命令说明命令用途前提trace追踪方法调用链及每一层耗时有流量经过实例stack输出方法被调用的调用路径有流量经过实例1.2 实战案例接口慢在哪里千阶智能外呼系统接口出现响应超时第一步就是用trace逐层定位耗时瓶颈# 追踪 WordQueryAPIImpl.getWord 的调用链耗时 trace com.qianjie.smart.api.word.WordQueryAPIImpl getWord输出结果会以树状结构展示每一层调用的耗时一目了然地看到哪个子方法是”罪魁祸首”---[123.45ms] com.qianjie.smart.api.word.WordQueryAPIImpl:getWord() ---[2.31ms] com.qianjie.smart.api.word.WordQueryAPIImpl:validateParam() #45 ---[5.67ms] com.qianjie.smart.api.word.WordQueryAPIImpl:preProcess() #52 ---[110.23ms] com.qianjie.smart.api.word.WordQueryAPIImpl:doResponse() #68 ---[1.12ms] com.qianjie.smart.api.word.WordQueryAPIImpl:postProcess() #75从输出可以看到doResponse耗时 110ms是整个接口的瓶颈。假设发现doResponse中主要是transform2RespWithFilter在耗时则继续深入# 继续追踪下一层 trace com.qianjie.smart.factory.ModelFactoryImpl transform2RespWithFilter ---[105.89ms] com.qianjie.smart.factory.ModelFactoryImpl:transform2RespWithFilter() ---[0.45ms] com.qianjie.smart.factory.ModelFactoryImpl:getFilterList() #120 ---[98.76ms] com.qianjie.smart.filter.WordFilterChain:doFilter() #135 | ---[50.12ms] com.qianjie.smart.filter.WordMatchFilter:doFilter() #45 | ---[45.67ms] com.qianjie.smart.filter.WordRankFilter:doFilter() #78 ---[3.21ms] com.qianjie.smart.factory.ModelFactoryImpl:buildResponse() #150可以看到WordFilterChain:doFilter耗时 98ms其中WordMatchFilter和WordRankFilter分别消耗了 50ms 和 45ms这就是根因所在。排障思路像剥洋葱一样从入口方法开始逐层trace直到定位到真正的耗时节点。1.3 进阶用法# 过滤耗时大于 100ms 的调用 trace com.example.Service method #cost 100 # 排除 jdk 内部调用路径 trace com.example.Service method --exclude-class-pattern java.* # 追踪多次调用默认只追踪一次 trace com.example.Service method -n 5二、观察方法入参、返回值——watch2.1 命令说明watch是 Arthas 中最灵活的命令之一可以观察方法的入参params、返回值returnObj、异常throwExp以及目标对象target。观察点参数说明方法调用前-b观察入参方法返回后默认观察返回值方法异常后-e观察异常同时观察-b -s -e全生命周期2.2 实战案例连接池配置是否生效问题背景千阶智能平台配置了连接池最大值为 200但疑似未生效。配置文件如下spring: datasource: hikari: maximum-pool-size: 200通过 Arthas 验证实际生效值# 只查看最大连接数 watch com.zaxxer.hikari.HikariConfig getMaximumPoolSize Affect(class count: 1, method count: 1) cost in 45 ms, listenerId: 1 methodcom.zaxxer.hikari.HikariConfig.getMaximumPoolSize locationAtExit ts2026-07-13 10:23:45; resultInteger[10] # 查看所有属性展开2层 watch com.zaxxer.hikari.HikariConfig getMaximumPoolSize -x 2 Affect(class count: 1, method count: 1) cost in 38 ms, listenerId: 2 methodcom.zaxxer.hikari.HikariConfig.getMaximumPoolSize locationAtExit ts2026-07-13 10:24:12; resultInteger[10] HikariConfig[ maximumPoolSizeInteger[10], minimumIdleInteger[10], idleTimeoutLong[600000], maxLifetimeLong[1800000], connectionTimeoutLong[30000], ... ]结果分析配置最大连接数为 200实际生效为 10 →不符合预期配置未生效配置最大连接数为 5实际生效为 5 →符合预期关键洞察watch让我们在不重启、不加日志的情况下直接”看到”运行时的变量值快速验证配置是否按预期加载。2.3 进阶用法# 观察入参和返回值 watch com.example.Service method {params, returnObj} -x 3 # 按条件过滤只观察第一个参数大于 100 的调用 watch com.example.Service method {params, returnObj} params[0] 100 # 观察异常 watch com.example.Service method {params, throwExp} -e # 观察调用耗时 watch com.example.Service method #cost三、获取与修改 JVM 变量——ognl这是 Arthas 最强大的能力之一在运行时读取甚至修改 JVM 内部的任意变量无需重启服务。3.1 静态变量# 获取静态变量 ognl com.example.ConfigDEFAULT_VALUE # 修改静态变量 ognl com.example.ConfigDEFAULT_VALUEnew_value3.2 实例变量场景获取方式修改方式有流量通过watchwatch ognl 表达式无流量通过springbean ognlspringbean ognl3.3 实战案例无流量时修改实例变量千阶智能平台在凌晨无流量时段需要紧急修改某个业务服务的实例变量。第一步准备 BeanFactoryHelper在项目中新增一个静态 Bean 工厂类通过 Spring 的BeanFactoryAware回调获取BeanFactoryComponent public class BeanFactoryHelper implements BeanFactoryAware { private static BeanFactory beanFactory; Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { BeanFactoryHelper.beanFactory beanFactory; } public static Object getBean(String beanName) { return beanFactory.getBean(beanName); } public static T T getBean(ClassT requiredType) { return beanFactory.getBean(requiredType); } public static boolean containsBean(String beanName) { return beanFactory.containsBean(beanName); } }第二步获取目标类的 ClassLoader Hashsc -df com.qianjie.smart.infrastructure.bs.BsQueryService输出中重点关注classLoaderHash后续 ognl 命令需要用到class-info com.qianjie.smart.infrastructure.bs.BsQueryService code-source file:/home/work/java/smart-app/target/smart-app.jar!/BOOT-INF/lib/smart-infrastructure-1.0.0.jar!/ name com.qianjie.smart.infrastructure.bs.BsQueryService isInterface false isAnnotation false isEnum false isAnonymousClass false isArray false isLocalClass false isMemberClass false isPrimitive false isSynthetic false simple-name BsQueryService modifier public annotation org.springframework.stereotype.Component interfaces super-class -java.lang.Object class-loader -org.springframework.boot.loader.LaunchedURLClassLoader6767c1fc -jdk.internal.loader.ClassLoaders$AppClassLoader2f333739 -jdk.internal.loader.ClassLoaders$PlatformClassLoader1172f803 classLoaderHash 6767c1fc fields name log type org.slf4j.Logger modifier final,private,static value Logger[com.qianjie.smart.infrastructure.bs.BsQueryService] name protocolSeparator type java.lang.String modifier name enter type java.lang.String modifier name defaultKey type java.lang.String modifier第三步查看变量ognl -c 6767c1fc #instancecom.qianjie.smart.utils.BeanFactoryHelpergetBean(bsQueryService)输出BsQueryService[ logLogger[Logger[com.qianjie.smart.infrastructure.bs.BsQueryService]], protocolSeparatorString[\r\n.\r\n], enterString[\r\n], defaultKeyString[99], ]第四步修改变量ognl -c 6767c1fc #instancecom.qianjie.smart.utils.BeanFactoryHelpergetBean(bsQueryService), #fieldObjcom.qianjie.smart.infrastructure.bs.BsQueryServiceclass.getDeclaredField(defaultKey), #fieldObj.setAccessible(true), #fieldObj.set(#instance,88)修改后再次观察确认defaultKey已从99变为88BsQueryService[ ... defaultKeyString[88], ]核心原理通过 Spring BeanFactory 获取实例引用再通过反射setAccessible(true)突破 访问控制直接修改 私有字段值。整个过程无需重启 JVM。四、类加载与热替换 Class当线上代码有 Bug 但无法立即发版时Arthas 支持热替换 Class 文件# 查看类加载信息 sc -df com.example.TargetClass # 反编译线上代码确认当前逻辑 jad com.example.TargetClass methodName # 热替换用本地编译好的 class 文件替换线上的 redefine /path/to/TargetClass.class注意事项redefine后原来的类不能被 GC需注意内存影响优先使用retransform它支持回滚操作热替换是临时方案务必在下一版本中正式修复五、CPU 与内存热点分析5.1 CPU 线程热点# 查看最消耗 CPU 的线程 thread -n 5 # 查看指定线程的堆栈 thread thread-id # 查找死锁 thread -b5.2 CPU 方法热点# 持续采样输出最耗 CPU 的方法 profiler start --event cpu # ... 运行一段时间 ... profiler stop5.3 内存方法热点# 分析内存分配热点 profiler start --event alloc # ... 运行一段时间 ... profiler stop建议 profiler 采样时间建议 30s-60s太短数据不准太长影响性能。六、经典排障案例总结Case 1接口太慢定位耗时根因trace 入口方法 → 发现慢子方法 → trace 子方法 → 逐层深入 → 定位根因关键像剥洋葱一样逐层追踪不要一次 trace 太深。Case 2变量值是否符合预期场景命令有流量经过watch 观察入参/返回值无流量经过springbean ognl 直接读取Case 3配置中心丢失需紧急修改配置场景千阶智能配置中心挂了不能重启一重启就挂但需要修改某个 VIP 地址或域名。方案一Arthas 热修改# 通过 springbean ognl 直接修改 JVM 内部的配置变量 ognl -c classLoaderHash #instancecom.example.BeanFactoryHelpergetBean(configBean), #fieldcom.example.ConfigBeanclass.getDeclaredField(targetVip), #field.setAccessible(true), #field.set(#instance,10.10.10.10)方案二内核四层转发需 root 权限# 配置 iptables 将旧 VIP 的流量转发到新 VIP iptables -t nat -A PREROUTING -d 10.11.12.13 -j DNAT --to-destination 10.10.10.10方案选择优先用 Arthas 热修改影响范围小只有在 Arthas 无法触达的场景才用 iptables。七、Arthas 命令速查表场景命令说明方法耗时trace 类名 方法名逐层追踪调用链耗时调用路径stack 类名 方法名查看方法被谁调用入参/返回值watch 类名 方法名 {params,returnObj}观察方法入参和返回值静态变量ognl 类名变量名读取/修改静态变量实例变量ognl springbean读取/修改实例变量类信息sc -df 类名查看类加载信息反编译jad 类名 方法名查看线上代码热替换redefine /path/to/Class.class热替换 Class 文件CPU 热点线程thread -n 5Top 5 CPU 消耗线程死锁检测thread -b查找死锁性能采样profiler start/stopCPU/内存热点分析结语Arthas 的核心价值在于不重启、不侵入、实时诊断。掌握trace、watch、ognl三板斧足以应对 80% 的线上排障场景。而redefine和profiler则是进阶利器在紧急修复和性能调优中发挥关键作用。

相关新闻

如何快速批量下载哔咔漫画:多线程下载器完整使用指南

如何快速批量下载哔咔漫画:多线程下载器完整使用指南

如何快速批量下载哔咔漫画:多线程下载器完整使用指南 还在为网络不稳定无法畅快阅读哔咔漫画而烦恼吗?每次追更时突然加载失败,收藏的漫画无法离线保存,手动一页页保存耗时费力……这些问题都将成为过去!今天我要介绍…

2026/7/21 23:07:52 阅读更多 →
本地部署Whisper.cpp+Llama.cpp+ElevenLabs实现GPT-4o级语音交互

本地部署Whisper.cpp+Llama.cpp+ElevenLabs实现GPT-4o级语音交互

1. 项目概述:在本地跑出接近GPT-4o语音交互体验的完整链路“Whisper.cpp Llama.cpp ElevenLabs: Local GPT-4o-like Voice Heaven”——这个标题不是营销噱头,而是我过去三个月反复打磨、压测、拆解再重装的实操成果。它描述的是一条完全脱离云端大模型…

2026/7/21 23:07:52 阅读更多 →
KNN算法实战:从原理到Python实现与优化

KNN算法实战:从原理到Python实现与优化

1. KNN分类器入门:从零开始的机器学习实践 K最近邻(K-Nearest Neighbors,简称KNN)算法是我在数据科学教学中首推的入门算法,原因很简单——它完美诠释了"物以类聚"的直观思想。记得第一次用KNN完成鸢尾花分类…

2026/7/21 23:06:52 阅读更多 →

最新新闻

3分钟终极指南:如何用Reset Windows Update Tool修复Windows更新故障

3分钟终极指南:如何用Reset Windows Update Tool修复Windows更新故障

3分钟终极指南:如何用Reset Windows Update Tool修复Windows更新故障 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool …

2026/7/22 1:08:12 阅读更多 →
国内Agent技术发展现状与核心开发实践

国内Agent技术发展现状与核心开发实践

1. Agent技术在国内的发展现状与生态格局Agent技术作为一种能够自主执行任务、感知环境并做出决策的智能系统,近年来在国内呈现出爆发式增长态势。从技术实现层面来看,国内Agent生态主要围绕以下几个核心方向展开:基础架构层:包括…

2026/7/22 1:08:12 阅读更多 →
深入解析SoC互连架构:L3总线、NIU与性能监控实战指南

深入解析SoC互连架构:L3总线、NIU与性能监控实战指南

1. 项目概述与核心价值在任何一个复杂的片上系统(SoC)设计中,芯片内部的“交通网络”——也就是互连架构——往往是决定整个系统性能上限和稳定性的关键。你可以把CPU核心、DSP、内存控制器、各种高速外设想象成一座现代化城市里的各个功能区…

2026/7/22 1:08:12 阅读更多 →
让飞牛NAS多一个AI管家:Hermes常驻运行、微信调用与远程管理

让飞牛NAS多一个AI管家:Hermes常驻运行、微信调用与远程管理

前言 很多人的NAS都是24小时开机,但真正长期运行的任务并不多。除了存文件、下载资源和挂几个Docker服务,大部分时间它都处在低负载状态。对RK3566、N1这类低功耗小主机来说,只承担存储工作,多少有些浪费。 我之前也尝试过在NAS…

2026/7/22 1:08:12 阅读更多 →
金融 AI 应用合规成本:安全审计和可解释性对 ROI 的影响

金融 AI 应用合规成本:安全审计和可解释性对 ROI 的影响

金融 AI 应用合规成本:安全审计和可解释性对 ROI 的影响算大模型 ROI 时,把合规成本漏掉,等于只算了一半账。一、场景痛点:合规成本是金融 AI 的隐形成本黑洞 去年帮一个城商行做 AI 客服的 ROI 测算,需求方给的数据是…

2026/7/22 1:08:12 阅读更多 →
大模型与 Agent 深度融合:人机协作模式的技术边界与应用前景——企业级智能自动化选型与工程化落地指南

大模型与 Agent 深度融合:人机协作模式的技术边界与应用前景——企业级智能自动化选型与工程化落地指南

在人工智能与企业架构演进的交汇点,大模型与Agent的深度融合正经历从“技术概念验证(POC)”向“生产力基础设施”的范式转移。行业共识已从单纯追求模型参数规模的扩大,转向关注Agent在复杂场景下的工程化落地能力。大模型作为系统…

2026/7/22 1:07:11 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻