环境linux
1、top + jstack
命令输入:top,查看CPU过高的进程获取到PID
命令输入:top -Hp 进程PID,获取到当前PID的所有线程,获取到CPU线程最高的PID
命令输入:printf %x 线程PID,将线程PID10进制转为16进制,为了后面文件定位查看
命令输入:jstack 进程PID > 1.txt,将进程输出到1.txt
命令输入:cat 1.txt | grep -A 30 线程16进制号
这样就可以定位到代码编写问题了
2、JMC
但是它只能使用JMX实现远程连接,服务端必须开启JMX才可以使用
3、可能导致CPU过高的场景与解决方案
- 无限while循环
尽量避免无限循环
让循环执行的慢一些,如加sleep等待1s之类 - 频繁GC
降低GC的频率 - 频繁创建对象
合理的使用单例 - 序列化和反序列化
使用合理的API实现功能
选择好用的序列化/反序列化类库 - 正则表达式
减少字符匹配期间执行的回溯 - 频繁的线程上下切换
降低切换的频繁,这个说起来简单,要结合业务做一些代码的改造,取决于业务的难度