今天写了一段垃圾代码,然后上服务器上运行,cpu瞬间飙到了100%,现记录一下问题排除过程~
1. 问题代码
1 package qinfeng.zheng.mockmvcdemo; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Component; 5 import qinfeng.zheng.mockmvcdemo.service.UserService; 6 7 import javax.annotation.PostConstruct; 8 9 @Component 10 public class TestComponent { 11 12 @Autowired 13 private UserService userService; 14 15 @PostConstruct 16 public void init() { 17 new Thread(()->{ 18 while (true) { 19 if ( userService.getUser() !=null) { 20 // do something 21 } 22 } 23 }).start(); 24 } 25 }
2. top
3. 查找问题
3.1 top -Hp 18571, 找出最耗cpu的线程,结果发现18584是就耗了99.9%
3.2 将十进制的线程号转成十六进制
printf "0x%x\n" 18584
3.3 jstack查找问题代码
jstack 18571| vim +/0x4898 -
跑去看TestComponent.java 的第19行~~~~ 死到这里了。。。。。
网上百度一波,while(true) 超级耗cpu, Thread.sleep(1) , 睡一下,cpu直接降到1%
日拱一卒无有尽,功不唐捐终入海