典型排查问题案例

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键


v2-0420d291addbd17b2272d4baa7077d89_b.jpg


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

1.3 定准到搞事情的线程

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


v2-309d45683d07a3ec975930e10c971f31_b.jpg


1.4 将线程id转换成16进制

printf "%x\n" 5718

输出1656

1.5 查看对应的线程代码

jstack 5717 | grep 1656 -A5 -B5


v2-a14311f0328a7a24315e7be613fad6a7_b.jpg


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键


v2-63e43a0dde4d98766ec9b036818f6353_b.jpg


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

1.3 jmap 命令查看

jmap -histo:live 10206


v2-4d7743df6d42c2deaf30c456f5d755dc_b.jpg


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值