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数组。