JAVA 排查姿势简介
java 排查姿势简介
Greys-anatomy
greys-anatomy 是一款很优秀的 java 诊断工具, 由阿里的一位工程师开发维护,并开源到 github 上。
安装
github 上的文档说明的很详细了, 而且是中文文档, 阅读基本无障碍。linux 环境, 通过
curl -sLk http://ompc.oss.aliyuncs.com/greys/install.sh|sh
或者短链接
curl -sLk http://t.cn/R2QbHFc|sh
安装即可
使用
- 在 linux 环境下, 首先需要设置 JAVA_HOME 路径,不过一般都设置过。修改 /etc/profile 文件, 或者修改 .bashrc 文件, 当然, 我们可能没有权限,此时可以通过 export JAVA_HOME=/xxx 来临时设置该变量
- 通过 jps 命令来查找需要诊断的 java 程序对应的 pid
- 通过 ./greys pid 来运行格雷医生
- 好了, 至此, 你就能通过提供的 文档 , 来查找定位你的 java 问题了。
常用命令
watch
该命令能监控指定方法的入参,出参数据
watch -b com.xxx.xxx.xxx helloWorld '"params[0]="+params[0]'; watch -s com.xxx.xxx.xxx helloWorld returnObj -x 3;
trace
该命令能追踪一级方法的调用链路, 同时打印出对应方法的耗时, 可以用来做性能分析
trace com.xxx.xxx.xxx helloWorld
ptrace
是 trace 命令的增强版, 具体请参见 github
tt
TimeTunnel 时间隧道。 该命令很强大, 能记录指定方法的所有入参,出参和抛出的异常。
通过 -i index 可以查看具体 index 的详细信息
通过 -i index -p 来自主发起调用
具体请参见 github
others
- stack
- sc
- sm
- monitor
- reset
- .....
Arthas
链接 https://github.com/alibaba/arthas
线上 debug
我本地跑的好好的, 怎么到了线上就出了各种问题了???
莫慌, 远程 debug 来助你找到元凶。
这里选择 IDEA 编译器来演示, Eclips 可自行 Google 使用办法。
线上 java 服务配置
在 java 程序启动的时候, 添加如下启动参数(该配置只针对 jdk5-8 的版本)
-agentlib:jdwp=transport=dt_socket,server=y,address=8888,suspend=n
- jdwp: java debug wire protocol 自定义的一套远程 debug 协议
- transport=dt_socket 通过 socket 传输
- server=y server 端监听将要连接的 debug client,否则,将连接到特定地址上的 debug client。
- suspend=n 告知 jvm 立即执行, 无需等待 debug client 连接(设置为 y 时, 会等待链接)
- address=8888 debug 调试端口(有时连接不上, 可能服务端所在宿主机的端口没开)
对于区分不同环境的启动脚本而言, 只需要定义 JAVA_OPTS 变量, 在开发环境(一般测试和生产不可随意添加这种启动参数)启动时, 加上该变量即可。 同时要注意,配置的端口号,server 端是否有开放,一般情况下,server 端的端口都是有限开放。所以配置前要确认端口是否开放。
IDEA 配置
在 idea 上找到 edit configurations
在左侧菜单找到 remote 选项,填写相关内容(host 为 server 端 host, port 为上文中 address 对应的端口值)
配置完毕, 启动服务,即可愉快的开始 remote debug 了。
这里需要注意的一点,如果有多线程程序需要调试, 你需要把断点类型设置为 Thread。