1. CPU 飙升定位

1.1 示例代码

public class Hello{ public static void main(String[] args){ System.out.println("hello"); int i = 0; while(true){ i++; i--; } } }

代码简单得不行了,明显是一个死循环。

1.2 top命令查看

通过top命令查看如下截图,按P键


典型排查问题案例


可以看到pid = 5717的进程CPU 高达99%

1.3 定准到搞事情的线程

执行top -Hp 5717 命令找出对应的线程出来


典型排查问题案例


1.4 将线程id转换成16进制

printf "%x\n" 5718

输出1656

1.5 查看对应的线程代码

jstack 5717 | grep 1656 -A5 -B5


典型排查问题案例


1.6 总结

找出最浩cpu的思路是先找出进程id,再找出线程id,转换成16进程后,通过jstack来定位到相应的代码,主要grep 命令的技巧,可以输出关键字前后几行。

top 命令中,按P键以cpu从大到小排序,大写M以内存大小排序

2. 最占内存的代码

2.1 示例代码

public class Hello1{ public static void main(String[] args) throws Exception{ byte[] b1 = new byte[1024*1024*50]; byte[] b2 = new byte[1024*1024*50]; byte[] b3 = new byte[1024*1024*50]; byte[] b4 = new byte[1024*1024*50]; byte[] b5 = new byte[1024*1024*54]; Thread.sleep(2000000); } }

1.2 top命令查看

通过top命令查看如下截图,按M键


典型排查问题案例


注意:这里有两个内存相同的进程,要多试一次,其实这个case是要用第二个进程

1.3 jmap 命令查看

jmap -histo:live 10206


典型排查问题案例


[B 表示的是字节数组,与前面的代码相符,new 了多个byte数组。

相关文章:

  • 2021-08-24
  • 2022-12-23
  • 2021-09-27
  • 2022-01-30
  • 2021-07-01
  • 2022-01-20
  • 2021-09-16
  • 2021-06-16
猜你喜欢
  • 2021-10-31
  • 2022-12-23
  • 2021-11-08
  • 2021-06-17
  • 2021-09-22
  • 2021-07-12
  • 2021-06-16
相关资源
相似解决方案