如何通过top 和 jstack 确定哪些线程耗尽CPU
本篇文章给大家分享的是有关如何通过top 和 jstack 确定哪些线程耗尽CPU,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
背景
线上集群 load 会突然飙升,CPU 使用率 100%,无法响应正常请求,然后服务器宕机。
那么引起 load 飙升的线程究竟在做什么?哪些线程霸占了CPU?可以通过 top 和 jstack 命令进行定位。
定位步骤
1. top 找出占用 CPU 高的进程 PID
2. top -p PID -H 命令查出进程中占用CPU最高的线程
3. 根据线程ID(需要十进制转成十六进制),从线程栈中找出步骤2查出的线程
printf 0x%x 43845
4. jstack -l PID 命令打印出线程栈
发现是大量 GC 线程在运行。
为什么是 GC 线程呢?
最终定位问题是,调用数据库查询方法 List queryForList(Query query) 拉取大量数据集合加载到内存,这些集合数据还都是小数据。小数据首先被 JVM 加载到年轻代,但年轻代内存很快就占满,JVM 进行 yongGC,数据被转移到老年代,但老年代内存也很快被占满,JVM 有进行 full GC,由此造成雪崩,内存占用率 100%,CPU 使用率 100%。
以上就是如何通过top 和 jstack 确定哪些线程耗尽CPU,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注蜗牛博客行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。版权声明:如无特殊标注,文章均为本站原创,转载时请以链接形式注明文章出处。
评论