arthas性能监控,本地调试方法

本文介绍了如何使用arthas进行性能监控和本地调试。首先,在目标进程中配置远程调试,然后通过arthas连接并监听指定进程。接着,通过arthas的命令设置监控选项,并观察监控结果。最后,分析源码中asm动态字节码插入的原理以及本地打包流程。

1、在目标监控进程(要查看该进程popularity中某个方法的性能) ,配置远程调试

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000

 

2、在arthas 中远程连接上要监控的进程的远程调试,配置如下的连接

127.0.0.1 8000

 

3、在arthas的控制台中,起动监听进程

as.bat pid 连接上去(pid为popularity 进程的本地进程id)

4、 arthas 源码中自动就会可以远程调用arthas的源码了。

 

5、使用如下命令进行验证

options save-result true   --保存结果

options dump true   --把监控的类dum出class文件,然后通过反编译文件进行查看

 options  json-format true   --把控制台输出的方法结果json化

$ watch com.test.mobile.popularity.service.cache.PopularityRankCache getCurNotFinishDay "{params,returnObj}" -x 2 -b   --起动监控,输出如下

 

$ watch com.test.mobile.popularity.service.cache.PopularityRankCache getCurNot
FinishDay "{params,returnObj}" -x 2 -b
Press Ctrl+C to abort.
[dump: G:\workspace\testweb\popularity\mobile-popularity\mobile-popularity-app\.\a
rthas-class-dump\com\test\ent\mobile\popularity\service\cache\PopularityRankCache.
class]
Affect(class-cnt:1 , method-cnt:1) cost in 54993 ms.
ts=2018-11-13 15:53:46;result=[["20181113"],null]

 

6、反编译生成的class文件,可看到,其实是通过asm的方式,在方法的入口和出口加了一段静态的方法,

    private List<HitRankInfo> getCurNotFinishDay(final String curDay) {
        Spy.ON_BEFORE_METHOD.invoke(null, new Integer(0), this.getClass().getClassLoader(), "com/test/popularity/service/cache/PopularityRankCache", "getCurNotFinishDay", "(Ljava/lang/String;)Ljava/util/List;", this, new Object[] { curDay });
        try {

   --------

       final List<HitRankInfo> list = hitList;
                Spy.ON_RETURN_METHOD.invoke(null, list);
                return list;
            }

    catch (Throwable e) {
                final Object o = null;
                Spy.ON_RETURN_METHOD.invoke(null, o);
                return (List<HitRankInfo>)o;
            }
        }
        catch (Throwable t2) {
            Spy.ON_THROWS_METHOD.invoke(null, t2);
            throw t2;
        }
    }

可看到上面添加的静态方法(静态方式的适应是因为调试人员是通过telnet的方式连上去的,是通过threadLocal的方式进行内部数据的管理的)。低层通过SessionImpl中的lock机制,保证监控系统只有唯一一个串行执行的命令

 

7、源码修改后,可本地打包

mvnw.cmd clean package -DskipTests

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值