写点什么

面试官问:如何排除 GC 引起的 CPU 飙高?我脱口而出 5 个步骤

用户头像
田维常
关注
发布于: 2020 年 11 月 20 日

关注“Java 后端技术全栈”


回复“000”获取大量电子书


在工作中,当一个系统发生OOM的时候,这种问题可能会让大家很烦恼困惑,因为故障排查起来是一个综合技术的考量。在平时工作中要增加自己的知识广度,多学习,多总结,多思考,多做笔记,这才是真正的王道。



尤其是在线上环境中,如何分析是哪个线程导致的 CPU 飙高的问题,通常大致有几个差不多固定的步骤。这个问题也是面试频率非常之高的问题之一,很多人也是靠回答这个问题而加薪。


常见套路步骤:


使用 top 命令

使用top -H pid

使用prinf %x tid

使用jsack pid >pid.log

查阅less pid.log


下面就来说一下这几个步骤。


top


我们可以使用 top 命令来查找对应使用 CPU 最多的进程,找到后,先记录下对应的 pid(后面要用到)。


再使用 Shift+P 这两个快捷键可以按 CPU 的使用率进行排序。


top-H pid


再次使用 top 名,但是这次增加一个参数-H,可以查看上面找出来的 pid 进程中对应的线程 tid,记住这时候的线程 tid 得记住


printf


但是此时的 tid 是十进制的,我们需要把这个 tid 转成 16 进制。然后使用


printf %x tid


stack


使用 jstack 工具把线程信息输出到对应的日志文件中,后面使用这个日志文件内容进行分析。


jstack pid >pid.log


less


上面已经生成日志文件了,这时候可以使用 less 命令来查找上面已经转换好的 16 进制的线程 tid。


less pid.log


其它



另外还可以使用


jstat -gcutil pid 1000 10


来查看垃圾回收的实时情况。


关于 jstat 的使用前参考前面的文章 工具


推荐一篇很全的线上 CPU 飙高的解决文章


http://woaijava.cc/blog/20111...


推荐阅读:


《Spring Cloud与Docker微服务架构实战》.pdf


《Go语言实战》.pdf


《分布式Java应用基础与实践》.pdf


发布于: 2020 年 11 月 20 日阅读数: 40
用户头像

田维常

关注

关注公众号:Java后端技术全栈,领500G资料 2020.10.24 加入

关注公众号:Java后端技术全栈,领500G资料

评论

发布
暂无评论
面试官问:如何排除GC引起的CPU飙高?我脱口而出5个步骤