Linux中Java异常排查的常用命令
每个人都希望自己的代码是0Bug,上线后一直平稳,也不会出现任何问题,但是事与愿违,当我们的代码部署上线,可能会因为代码Bug,或者其他甚至表面上看起来显得莫名其妙的原因而爆出异常问题。为了搞清楚这些问题的原因并解决掉,我们需要借助一些工具、手段去分期现象背后的起因。由于年纪比较大,记性是越来越不行,故有此记。
日志排查
当我们接到业务反馈某个业务在某种情况下无法操作时,这时候,一般是查询日志,关于查询日志,如果是多实例部署时,那么日志集中存储则显得尤为重要了。针对K8S的多实例服务,我们则收集到ES中集中存储。那种非K8S部署的服务,我们则直接存在宿主机中,这时候,我们可以直接使用tail -f 日志文件
来查看,如果日志文件较小,我们可以用vim
来进行关键字查询,如:
1 | vim catalina.out |
进入文件编辑模式后,输入/
+关键字
即可查找,比如,我们需要查找20220803000081817
这个关键字:
1 | /20220803000081817 |
然后回车
可以看到,关键显示高亮,我们可以使用n
键查找下一个关键字,使用shift+n
查找上一个关键字。
除了使用vim
外,我们还可以使用grep
来查找关键字,格式为grep -C 行数 关键字 文件
1 | grep '20220803000081817' -C 2 catalina.out |
grep
有-A
、-B
、-C
三个参数:
- -A 显示匹配指定内容及之后的n行
- -B 显示匹配指定内容及之前的n行
- -C 显示匹配指定内容及其前后各n行
有些日志没有做日志分割,一天会生成10G+大小的文件,这种在我们查询时会比较麻烦,不可能吧10G+的文件全部加载到内存中来查找。我们可以借助sed
命令来导出指定时间段日志内容,前提是,日志文件的时间格式要标准。这里我们想要导出2022-08-03 12:00
至2022-08-03 13:00
的日志,语句如下:
1 | sed -n "/2022-08-03 12:00/,/2022-08-03 13:00/p" catalina.out > 0803.txt |
最终会把指定时间段的日志写入到0803.txt
这个文件中,日志便小了许多。
Linux查看Java线程运行情况
1.先用top
命令,或者ps -ef|grep 关键字
来查找PID
2.top -Hp <pid>
来查看进程内的线程资源使用情况
3.printf "%xn" <线程ID>
来转换成16进制,
为什么要转16进制呢?我们来看看jstack
我们可以看到线程Id是16进制,所以需要转为16进制,才能方便后面jstack <pid> | grep <tid>
来定位到具体的线程。
jstat -gcutil查看JVM运行情况
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
Linux中Java异常排查的常用命令