学习arthas(十三)监视代码的执行结果

arthas watch命令是arthas工具提供的一个命令,用于在应用运行过程中观察指定方法的执行情况,可以帮助开发人员实时监视指定类和方法的调用情况。可以方便地观察到指定方法的调用与执行情况,对于代码执行的:返回值、异常、入参、this等代码范围,通过OGNL表达式进行对应代码逻辑范围上执行的应用排查。 (1)监控一个类的一个方法,跟踪参数、this对象、返回值、异常信息 watchcn.chendd.blog.admin.blog.tag.controller.TagManageControllerqueryTagsPage --exclude-class-pattern*CGLIB*-x2{params,target,returnObj,throwExp}[objectObject] (2)监控方法调用超过 100 秒以上 watchcn.chendd.blog.admin.blo...

文章分类:经验分享 技术知识

Arthas

学习arthas(十二)跟踪方法代码的执行

1.基本介绍 trace命令是Arthas工具中的一个强大的命令,用于跟踪方法的执行情况。它可以帮助开发人员进行代码调试、性能分析和问题排查,是一个动态方法追踪命令,提供了一种跟踪方法参数和返回值、异常情况等的方法。trace 能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,但其每次只能跟踪一级方法的调用链路,对一个方法内部的调用路径进行追踪,输出方法路径上每个子方法的调用耗时细节。 通过使用arthas trace命令,可以灵活地跟踪指定类和方法的执行情况,并结合选项进行更精细的控制。这对于调试和性能分析非常有帮助。需要注意的是arthas trace命令会对目标方法进行字节码增强,因此在使用完毕后,建议使用retransform命令恢复字节码,以避免对应用程序的性能造成影响。 trace命令可以对方法内部调用路径,并输出方法路径上的每个节点上耗时。trace 命令能主动搜索 ...

文章分类:经验分享 技术知识

Arthas

学习arthas(十一)输出方法调用栈

stack 命令用于查看指定类和方法的调用栈信息,即堆栈信息,包含方法调用链、堆栈深度等信息,用于追踪程序执行的调用路径,同时也可以帮助我们直观的查看某个类是怎么被调用执行的,特别是在分析一些开源项目的源码时,还是有一定的用武之地的。 1.基本介绍 调用栈信息包括每个线程的调用树,从最上层的方法开始,依次展示方法的调用关系。每个方法的信息包括类名、方法名、源码位置等。通常在方法抛出异常后,可以看到异常的堆栈信息,通过堆栈中异常的原因描述来定位异常所发生的位置和异常发生的原因,实际上对于正常运行的代码也是存在方法调用堆栈的,只不过通常情况下大家不会使用到,比如下列代码可获取到方法调用时的堆栈,参考如下: publicstaticvoidinfo(Stringmessage){ StackTraceElement[]stackTraceElements=Thread.currentThread...

文章分类:经验分享 技术知识

Arthas

学习arthas(十)方法执行结果监控

Arthas的monitor命令是其强大的监控功能之一,它可以帮助开发人员实时监控和分析一段时间段内Java应用程序的性能指标和方法调用情况,面向程序执行结果统计,命令属于异步定时反馈统计监控的结果,本文对于monitor命令做一个简单常用的实践。 1.基本用法 (1)monitor命令用于监控某个类的某些方法,类和方法名,都可以是完整的类名或通配符表达式; (2)监控参数选项有: -c:指定监控的周期,默认值为 120 秒。 -b:在方法调用之前计算 condition-express。若监控的条件有耗时时间,在调用之前计算条件表达式将会存在问题。 -E:开启正则表达式匹配,默认为通配符匹配。 2.应用场景 (1)性能优化:通过监控方法的执行时间和执行频率,可以发现应用程序中的性能瓶颈,从而进行针对性的优化。 (2)排查问题:当应用程序出现性能问题或异常情况时,可以使用monitor命令...

文章分类:经验分享 技术知识

Arthas

学习arthas(九)动态执行一些代码

所谓的执行一些代码主要是手工调用已有的一些被加载类的方法,并不是像JavaScript中的eval函数那么自由(本站深度研究过Apache Commons JCI项目可以动态的编译一些Java源代码为class,并加载它们来执行),本次主要使用arthas来执行一些已有的代码,这些代码并不一定是完整可调用的存在于某个方法,可能是需要多行自定义的方法,或者是单独新编写的,用于做一些补偿性的事情,比如某些原因导致的定时任务没有正常的执行,需要手工触发;再比如调用一些方法获取一些连接池的参数等等。 前面有使用`getstatic`和`ognl`分别做过一些实践,本次针对它们再次实践,属实是值得拥有。 1.getstatic实践 (1)通过 getstatic 命令可以方便的查看类的静态属性。使用方法为`getstatic class_name field_name`,推荐直接使用ognl命令,更...

文章分类:经验分享 技术知识

Arthas

学习arthas(八)查找某个被加载的类

1.基本介绍 有些时候查找某个被加载的类也是有必要的,当然抛出ClassNotFound异常的除外,特别是针对于需要改写一些第三方框架组件的源代码时,也许是因为源码中的实现不够理想,要么是需要做一些个性化的事情,通常我们的做法并不是去改写这些三方库的源代码jar,而是拷贝一份源代码放置于项目中的同包名同类名,再调整启动脚本优先加载项目内的classes或jar,而后再加载这些第三方的jar,使得预先加载的是项目中的代码(项目中修改过的代码)。所以,基本上有这几种场景是这么干过: (1)在使用Google的zxing生成二维码组件时,由于它默认生成的二维码带有一些宽度的白色边框(差不多10像素),如果需要取消白边,通常的做法就是改动源代码(本站有对于此问题的解决); (2)在使用第三方登录时(如:QQ、微博等)它们提供的SDK示例程序的参数都使用配置文件存储的,本站在实现时将这些配置文件存储...

文章分类:经验分享 技术知识

Arthas

学习arthas(七)arthas-tunnel-server的摸索

1.简单介绍 起初在下决心在开始摸索Arthas时,在GitHub的Release版本下载的链接里有一项名为“arthas-tunnel-server-3.7.1-fatjar.jar”的文件,尽管当初并不知道它是什么,作用是什么,仍然选择了实践arthas。随着实践的深入在掌握一些细节后也逐渐把这块东西的脉路给摸清楚了(非专业的浅见),我所理解arthas-tunnel-server的意思是一种arthas的server服务端,可单独作为arthas的中央服务器与各个项目连接,各个项目中内部集成arthas,无需额外再部署arthas,并以Web Console的方式在线访问,形成一种在线连接管理多个项目的集提继承,由各个项目自己提供arthas,arthas-tunnel-server负责请求命令转发交互。所以,此处奉上两个不专业的arthas应用部署结构图,参考如下: (单机应用结构...

文章分类:经验分享 技术知识

Arthas

学习arthas(六)增强命令

1.monitor 方法执行监控 (1)对匹配 class-pattern/method-pattern/condition-express的类、方法的调用进行监控。 (2)monitor 命令是一个非实时返回命令. (3)实时返回命令是输入之后立即返回,而非实时返回的命令,则是不断的等待目标 Java 进程返回信息,直到用户输入 Ctrl+C 为止。 (4)服务端是以任务的形式在后台跑任务,植入的代码随着任务的中止而不会被执行,所以任务关闭后,不会对原有性能产生太大影响,而且原则上,任何 Arthas 命令不会引起原有业务逻辑的改变。 监控的维度说明 时间戳(timestamp)、Java 类(class)、方法(构造方法、普通方法 method)()、调用次数(total)、成功次数(success)、失败次数(fail)、平均 RT(rt)、失败率(fail-rate) 参数说明 (...

文章分类:经验分享 技术知识

Arthas

学习arthas(五)类命令

1.sc 查看 JVM 已加载的类信息,“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息,这个命令支持的参数有 [d]、[E]、[f] 和 [x:]。 (1)class-pattern 支持全限定名,如 com.taobao.test.AAA,也支持 com/taobao/test/AAA 这样的格式,这样,我们从异常堆栈里面把类名拷贝过来的时候,不需要在手动把/替换为.啦; (2)sc 默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,请打开options disable-sub-class true开关; 2.sm 查看已加载类的方法信息,“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。 sm 命令只能看到由当前类所声明 (declaring) 的方法,...

文章分类:经验分享 技术知识

Arthas

学习arthas(四)系统命令

系统的命令并不是说操作系统的命令,这里是指与监控的Java进程相应的服务交互的指令,包含调用起来比较简单,可以查看整体进程信息的,所以我觉得这部分的命令范围如下文所示。 1.dashboard 描述:概述目标jvm的线程,内存,gc, vm, tomcat信息。 当前系统的实时数据面板,按 ctrl+c 退出。默认每间隔 5 秒执行一次实时数据的输出。 该命令有两个参数: -i, --interval <value> 这个命令执行的间隔时间,单位毫秒,默认5000毫秒,即5秒钟; -n, --number-of-execution <value> 这个命令将被执行的次数; 如:每间隔1秒输出一次,共执行2次,命令:dashboard -i 1000 -n 2 (帮助文档) (运行结果) 2.thread 描述:查看当前线程信息,查看线程的堆栈。 参数名称 参数说明 id 线程 id [n:...

文章分类:经验分享 技术知识

Arthas
本站信息

 运营时间: 天

 用户数量: 人

 文章数量: 篇

 评论数量: 条

 点赞个数: 个

 最后更新:

标签云