Java诊断我相信再日常开发中都十分需要.相信大家都使用过以下几种诊断方式:
1.肉眼诊断
就是出现问题时候企图通过肉眼来发现代码问题.通常很明显的问题有效;
2.日志诊断
通过给出问题的代码入参或者上下游加上日志,或者出问题的时候加上日志来诊断;这种方式的问题就是出现问题你需要重新拉分支,加日志,本地测试再上限这一系列流程.另外一个问题是过多的日志会影响应用性能;
3.监控诊断
通过完善的监控,通常包括完善且精确的异常划分.对不同的异常情况有独立的监控.加上完善的报警机制.这是最理想的情况.其优势是能快速定位问题点,问题是建立这一套完善的机制需要很长时间.并且监控只能发现问题类型,比如监控发现是数据错误,但是到底那条数据错误还是需要日志等手段来定位.
4.在线诊断工具
在不需要重新发布的情况下,在线诊断应用的问题所在.通常还可以用于定位接口瓶颈等问题;
这里简单介绍一下最近找到的几个在线诊断工具.它们都是非侵入式的,即不需要修改原始应用的代码再重新发布上线这个过程.
常用包括几个诊断工具包括,这里做一个简单的介绍:
1.BTrace
2.HouseMD
3.Greys-Anatomy
参考: http://www.infoq.com/cn/articles/java-profiling-with-open-source/
. 1.BTrace
Btrace(bytecode trace)是Kenai在2009年开发的一个开源项目(https://kenai.com/projects/btrace/),是一个动态跟踪分析JAVA源代码的工具。 它可以用来帮我们做运行时的JAVA程序分析,追踪,监控等.
官网: https://kenai.com/projects/btrace/
用户手册: https://kenai.com/projects/btrace/pages/UserGuide
samples下有很多使用例子.参考网上的一个例子: http://mgoann.iteye.com/blog/1409685
参考: http://wiki.corp.qunar.com/pages/viewpage.action?pageId=56198121
1.1使用场景:
1.数据采样 比如我们要优化某块代码,就可以先写一个btrace脚本,丢到线上服务器上跑一段时间; 这样可以收集到最真实的数据,而且不用发布之类的; 然后根据收集到的数据,做有目的的优化,优化之后,还可以对比出优化的效果。 2.排查问题 3.性能监控
1.2优点
1.跟踪任何java代码的调用(包括第三方类库中的,甚至jdk中的),比如统计某方法的调用次数,耗时。 2.可以监控的维度有很多,比如异常,同步块,内存申请,数组声明,甚至可以精确到行 3.完全不侵入业务代码,不需要重启服务 4.安全,对于应用内的数据来说是只读的。
1.3缺点
- 有较多的使用限制,如只能调用用BtraceUtils中的方法、不能写实例变量; (见docs/usersguide.html中的BTrace Restrictions条目) 所以刚编写脚本的时候,可能会有各种不习惯,但其实大多会用到的方法,BtraceUtils里都有封装 (其实个人感觉这个不算缺点,只是这个工具定位在追踪和监控,所以出于安全考虑,做了这个限制)
- 监控基本上只能单点,集群环境没法玩
- 被监控的服务重启,btrace也需要跟着重启 4.有影响原始应用的风险,严重可能导致JVM Crash.
1.4使用方式
Boot方式启动 追踪已启动的jvm进程 命令:btrace/bin/btrace 12345 SomeScript.java 注意,下载下来后bin下的文件都不可执行,需要chmod u+x,并且需要和目标进程是同一个用户来启动
Agent方式启动 与目标jvm同时启动 配置jvm参数:-javaagent:btrace-agent.jar=script=SqlMapTracer.class 注意:agent方式启动只能使用编译过的脚本 使用btrace/bin/btracec SqlMapTracer.java 编译 agent方式启动的btrace的标准输出位于你的SqlMapTracer.class所在目录下的SqlMapTracer.class.btrace文件
boot方式灵活,但是当要求追踪结果精确时,就不太好用了。因为不知道btrace启动之前,目标进程已经执行了多少代码。agent方式是和目标进程同时启动的,可以保证结果精确。
1.5原理
主要就是使用ASM来实现对类的修改,再使用Instumentation实现类的内存替换.
btrace原理: http://victorzhzh.iteye.com/blog/965789
btrace源码分析: http://agapple.iteye.com/blog/1005918
. 2.HouseMD
高负载服务器端Java程序 诊断工具的特性要求有:
1.命令行接口, 能够方便在服务器环境中运行;
2.支持常用诊断调式手段, 能够在其中快速来回切换;
3.容易定位跟踪目标, 且不易出错;
4.弱侵入, 目标Java程序无需任何修改, 不用重新部署或重启;
5.有效控制给目标进程带来的资源消耗;
6.不遗留任何"代码垃圾"等后遗症.
使用手册: https://github.com/CSUG/HouseMD/wiki/UserGuideCN
. 2.1安装
首先安装jenv:
1 2 3 4 5 6 |
|
再安装HouseMD就很简单:
1 2 3 4 5 6 |
|
. 3.Greys-Anatomy
Greys是一个java进程执行过程中的异常诊断工具。 在不中断程序执行的情况下轻松完成问题排查工作.
源码: https://github.com/oldmanpushcart/greys-anatomy
使用范例: https://github.com/oldmanpushcart/greys-anatomy/wiki/Getting-Start
交互方式: 命令行交互
功能:
1.查看加载类,方法信息
2.方法执行监控(调用量,成功失败率,响应时间)
3.方法执行数据观测(参数,返回结果,异常信息等)
4.方法执行数据记录
5.性能开销渲染
6.方法执行数据自定义观测(js脚本)
7.查看方法调用堆栈