利用Byteman来统计Java中方法的耗时

本文介绍了如何使用Byteman脚本来统计Java应用中方法的耗时,并通过实例演示了如何配置Byteman以适应不同的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学习了Byteman的一些基础用法,尝试使用Byteman脚本来统计Java应用中方法的耗时。


测试环境:

Java的版本信息:1.8.0_112-ea

Byteman的版本信息:byteman-download-3.0.6


主要步骤:

测试1. 验证Byteman与JDK版本是否兼容,能够正常工作。

BYTEMAN_HOME="/home/cindy/tools/byteman-download-3.0.6"
BYTEMAN_OPT="-javaagent:${BYTEMAN_HOME}/lib/byteman.jar=script:${BYTEMAN_HOME}/trace_main.btm

在java应用的启动命令行中加上上述参数,进行注入。

$ cat trace_main.btm
RULE checkByteman
CLASS MyAppLauncher
METHOD main
AT ENTRY
IF TRUE
DO traceln("*****IN MAIN*****"+System.currentTimeMillis())
ENDRULE

验证log中是否有该行输出。如果有,即byteman能够正常工作。


测试2:获得函数的RT。

调整应用启动命令行,可动态注入规则,方便在不用重启应用的情况下,进行规则的调整。

BYTEMAN_HOME="/home/cindy/tools/byteman-download-3.0.6"
BYTEMAN_OPT="-javaagent:${BYTEMAN_HOME}/lib/byteman.jar=listener:true,boot:${BYTEMAN_HOME}/lib/byteman.jar -Dorg.jboss.byteman.transform.all"

Byteman脚本内容:

$ cat trace_write_rt.btm
RULE trace write.entrytime
CLASS MyWriter
METHOD writeSync
AT ENTRY
IF TRUE
DO createTimer($1)
ENDRULE

RULE trace corgi.write.endtime
CLASS MyWriter
METHOD writeSync
AT EXIT
IF TRUE
DO traceln("-----writeSync RT:-----"+getElapsedTimeFromTimer($1));
   deleteTimer($1);
ENDRULE

动态加载规则:

$ sh bin/bmsubmit.sh -l trace_write_rt.btm

应用的log中就会打印出每次调用writeSync方法的RT,时间精度为毫秒。


注意在使用Timer时应该注意的几个问题:

1)为什么要加$1参数?

2)为什么要加deleteTimer($1)?


关于Timer用法的一些澄清,Byteman的作者对timer的详细说明,可以解答上面的问题。

https://issues.jboss.org/browse/BYTEMAN-72




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值