专栏名称: 互联网后端架构
主要介绍Java后端架构。其中也会掺杂一些前端、GO、Python、Linux,目标:全栈工程师!---好像很牛叉的样子 ^-^
目录
相关文章推荐
架构师之路  ·  80后聊架构:CAP对工程架构设计究竟有什么 ... ·  6 天前  
美团技术团队  ·  【报名】MARS TALK ... ·  6 天前  
51好读  ›  专栏  ›  互联网后端架构

通过 top 和 jstack 确定哪些线程耗尽了 CPU

互联网后端架构  · 公众号  · 架构  · 2017-08-18 12:51

正文

背景

线上集群 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%。