这是一些 java 程序查错的方法和经常使用的命令。
排查业务问题
- 采用
tail -fn 200 log_file
实时查询线上日志 - 找准日志搜索关键字 keyWord,例如 orderid、mobileId、reqId 等
- 采用
grep keyWord log_file
查询关键字所在行的日志 - 采用
grep -C n keyWord log_file
匹配关键字所在行的上下 n 行 - 采用
grep keyWord log_file | wc -l
匹配关键字的行数有多少 - 根据实际排查日志场景进行搜索 tail、grep 用的最多
线上应用 CPU 占用过高
- 采用
top
命令,找出 CPU 占用最高的 PID - 通过
ps -ef | grep PID
查看对应的应用 - 采用
jstack -l PID >> PID.log
获取进程额堆栈信息 - 采用
ps -mp PID -o THREAD,tid,time
拿到占用 CPU 最高的 tid - 采用
printf “%x\n” tid
获取 16 进制的线程 TID - 采用
grep TID -A20 PID.log
确定是线程哪里除了问题 - 腿疼医腿,辩证施治,对症下药,找准代码位置,进行调整代码
线上应用内存溢出
-
采用
top
命令,找出对应的 PID -
采用
jmap -heap PID
确认一下分配的内存少不少 -
采用
jmap -histo:live PID | more
找出分析最耗内存的对象 -
采用
ps -efL | grep PID | wc -l
查看进程创建的线程数 -
采用
ls -l /proc/PID/task | wc -l
也可以查看进程创建的线程数 -
采用
netstat -apn | grep 4532 | wc -l
查看进程网络连接数 -
腿疼医腿,辩证施治,对症下药
a. 内存分配确实小,适当调整内存;
b. 对象被频繁创建,且不释放,优化代码;
c. 不断创建线程或者不断进行网络连接,优化代码。
工具
JDK 自带工具
命令 | 说明 |
---|---|
jps | 查看 java 进程概述 |
jconsole | 图形化查看内存线程 VM 参数等信息 |
jstat | 查看内存使用状况 |
jstack | 分析线程 |
jmap | 查看内存信息或 dump 下内存详情 |
jvisualvm | 图形化工具,功能在 jconsole 之上 |
第三方工具
Arthas,官网 https://arthas.aliyun.com,功能强大,常用命令:
命令 | 说明 |
---|---|
dump | 将已加载的字节码文件保存到特定的目录中 |
classloader | 获取类加载器的信息 |
monitor | 监控指定类种方法的执行情况 |
watch | 观察指定方法的调用情况 |
trace | 对方法内部调用路径进行追踪,并输出方法路径上每个节点上耗时 |
stack | 输出当前方法被调用的路径 |
tt | 记录指定方法每次调用的入参和返回的信息 |
options | 全局开关 |
profiler | 生成火焰图 |
性能问题排查思路
- 设计调优:一个良好的系统设计可以规避很多钱在的性能问题。必须熟悉常用的软件设计方法、设计模式、基本性能组件和常用优化思想。
- 代码调优:掌握编码技巧、对算法、数据结构的灵活使用。
- JVM 调优:JVM 的各项参数会直接影响 Java 程序的性能。
- 数据库调优:在应用层对 SQL 语句进行优化;对数据库进行优化。
- 操作系统调优:操作系统的性能对应用系统也有较大影响。
- 腿疼医腿,辩证施治,对症下药。