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

安装即可

使用

  1. 在 linux 环境下, 首先需要设置 JAVA_HOME 路径,不过一般都设置过。修改 /etc/profile 文件, 或者修改 .bashrc 文件, 当然, 我们可能没有权限,此时可以通过 export JAVA_HOME=/xxx 来临时设置该变量
  2. 通过 jps 命令来查找需要诊断的 java 程序对应的 pid
  3. 通过 ./greys pid 来运行格雷医生
  4. 好了, 至此, 你就能通过提供的 文档 , 来查找定位你的 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

JAVA 排查姿势简介

在左侧菜单找到 remote 选项,填写相关内容(host 为 server 端 host, port 为上文中 address 对应的端口值)

JAVA 排查姿势简介


配置完毕, 启动服务,即可愉快的开始 remote debug 了。

这里需要注意的一点,如果有多线程程序需要调试, 你需要把断点类型设置为 Thread。

JAVA 排查姿势简介


您可能还会对下面的文章感兴趣: