第一种:top+jstack
1.top (找出最高的进程) 2.top -Hp 进程号(查看这个进程下面线程的使用情况) 3.printf %x 36044 (线程号转换十六进制) 4.jstack 36032 > 1.txt (36032为进程号,输出文档) 5.cat 1.txt | grep -A 30 8ccc(线程号转换十六进制) 打印8ccc后面30行
第二种:JMC
实际项目中必须打开JMC
项目当中cpu过高问题: 1.无限while循环 解决方案:避免这种循环,让循环慢一点(比如:加入sleep) 2.频繁GC 3.频繁创建对象(合理使用单例模式) 4.反序列化和序列化(合理选择API) 5.正则表达式,因为它要回溯 6.频繁切换线程上下文(结合业务逻辑)
一般定位问题需要复现,在问题复现期间定位,某个时间占用比较高的话,可以借助监控工具,当占用高时,推送告警,然后定位。