1、Arthas 利用 spring applicationContext获取任何Bean
RequestMappingHandlerAdapter
父接口ApplicationObjectSupport
存在获取spring上下文方法getApplicationContext()
- 执行任何一次请求, tt -t记录RequestMappingHandlerAdapter请求
排查问题时经常需要测试同学的配合重新发起请求,arthas为减少这种麻烦,提供了tt命令支持重放请求
1 | tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod |
执行tt命令获取Spring Application Context
执行tt命令的-i参数来指定index,并且用-w参数来执行ognl表达式来获取spring context1
tt -i 1000 -w 'target.getApplicationContext()
从Spring context中获取任何Bean对象
1
tt -i 1000 -w 'target.getApplicationContext().getBean("authConfigServiceImpl").listByLocationCode("510000")'
应用场景:
- 生产环境的任务是定时触发的,发生了异常,比如1天触发一次,又没有界面重新实时触发任务,这时就可以通过arthas Spring context获取业务的Bean对象重新触发一次任务方法。
2、Arthas 利用 trace记录方法的调用链路,并输出方法路径上的每个节点上耗时
trace 能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,trace 在执行的过程中本身是会有一定的性能开销,在统计的报告中并未像 JProfiler 一样预先减去其自身的统计开销
1 | trace com.alibaba.dubbo.rpc.Filter * '#cost > 1000' -n 1 |
3、Arthas 排查404问题
Java web中Servlet、Filter、Listener的优先级listener>filter>servlet
。
Listener是用于监听事件,Filter就是用来拦截进行一些日志类似aop的功能,而Servlet就是转发到别的页面。
1 | trace javax.servlet.Filter * -n 1 |
- 通过trace Servlet/Filter,可以快速定位Java Web问题
- trace是了解应用执行流程的利器,只要trace到关键的接口或者类上
- 仔细观察trace的结果,可以学习到Spring MVC是处理Web请求细节
4、如何在内部类对象中访问外部类对象的成员变量
1 | class ServerImpl implements TimeSource { |
想在内部类的run方法里面,访问allConnections这个变量的大小,应该如何写ognl表达式?
1 | watch sun.net.httpserver.ServerImpl$ServerTimerTask1 run -f "target.this$0.allConnections.size() |
微信公众号
愿你也能走出你的信息茧房
Blog
个人博客:http://www.geek-make.com。