思路

结合Linux和JDK命令分析

案例步骤

cpu占用过高代码

先用一段程序创建几个线程,将其中一个线程设置成高 CPU 使用率的。

  1. public class Main {
  2. public static void main(String[] args) {
  3. for (int i = 0; i < 10; i++) {
  4. Thread thread = new Thread(() -> {
  5. System.out.println(Thread.currentThread().getName());
  6. try {
  7. Thread.sleep(30 * 60 * 1000);
  8. }catch (Exception e){
  9. e.printStackTrace();
  10. }
  11. });
  12. thread.setName("thread-" + i);
  13. thread.start();
  14. }
  15. Thread highCpuThread = new Thread(() -> {
  16. long i = 0;
  17. while (true) {
  18. i++;
  19. }
  20. });
  21. highCpuThread.setName("HighCpu");
  22. highCpuThread.start();
  23. }
  24. }

上传到服务器执行

先用top命令找出CPU占比最高的

1610803597062.png

ps -ef或者jps进一步定位,得知是一个怎么样的一个后台程序惹事

  1. ps -ef | grep java | grep -v grep
  2. 或者
  3. jps -l

1610803597089.png

定位到具体线程或者代码

ps -mp 进程 -o THREAD,tid,time

参数解释

-m 显示所有的线程
-p pid进程使用cpu的时间
-o 改参数后是用户自定义格式

将需要的线程ID转换为16进制格式(英文小写格式)

printf "%x\n" 有问题的线程ID

jstack 进程ID | grep(16进程线程ID英文小写)-A60

输出一堆,但是只需要找到您公司的代码

1610803597134.png