anatomy --- #### 简介 anatomy 是阿里同学开发的一款用于JVM进程执行过程中的异常诊断工具,可以在不中断程序执行的情况下轻松完成问题排查工作。 * 纯Java实现的开源项目 * 安装使用便捷 * 方法级问题诊断 * Groovy表达式展开变对象,方便你观察入参、出参、异常、当前对象的各种属性细节 #### 接下来结合线上应用,列举常用的几个排查问题命令如何使用 1、安装: ``` curl -sLk http://ompc.oss.aliyuncs.com/greys/install.sh|sh ``` 2、启动 ``` greys.sh 注:PID:目标Java进程ID ``` 3、help ``` help 注:所有命令 help watch 注:help命令同时也支持对其他命令的一个解释说明,比如我们键入help watch,包含(用途说明、参数列表、实际例子) ``` 4、sc 搜索所有已经加载到JVM中的Class信息。 ``` sc -d *RecommendManagerImpl ``` **使用场景:** 主要是用于排查一个应用可能存在同一个jar包的多个版本,而不同版本的类的方法可能会有实现上的差异,可以通过这种方式确认JVM中加载的是哪一个jar下的类。 ![image](img/Snip20161002_1.png) 5、monitor 方法层面的性能监控,非实时返回的命令,则是不断的等待目标Java进程返回信息,直到用户输入Ctrl+D为止 ``` monitor -c 5 *TimelineReadServiceImpl getEditorRecPost 注:-c : 统计周期,默认值为120秒 ``` **使用场景:** 线上反馈某个接口突然响应较慢,但又缺乏全链路维度节点的监控,可以通过该命令能定位到具体哪个方法耗时较长,有效缩小排查范围。 ![image](img/Snip20161002_2.png) 6、trace 统计整个调用链路上的所有性能开销和追踪调用链路。 ``` trace -n 2 *TimelineReadServiceImpl queryRecPageTimeLine ``` **使用场景:** 定位查找某一接口响应较慢,主要是损耗在哪一个环节。 另外也可以做为性能优化的参考标准,了解一个接口下面每个环节的消耗时间,从而判断是否合理,有没有优化的空间 7、watch 观察到指定方法的调用情况 能观察到的范围:入参、返回值、抛出异常,通过编写groovy表达式进行对应变量的查看。详细使用手册可以通过命令help watch ``` watch -b *TimelineReadServiceImpl queryRecPageTimeLine params[0] 注:打印完整的入参信息 watch -b *TimelineReadServiceImpl queryRecPageTimeLine params[0] 'params[0].uid>2894731' 注:带上groovy表达式,uid>2894731 watch -s *TimelineReadServiceImpl queryRecPageTimeLine params[0]+returnObj 'params[0].uid==3680667' 注:当请求的uid为3680667时,打印入参和返回结果 ``` 8、 jvm 查看当前JVM的信息,无参数 ### 参考资料 https://github.com/oldmanpushcart/greys-anatomy/wiki/Commands#help