JVM 线上故障排查基本操作--CPU飙高
2024-08-30 10:05:42
JVM 线上故障排查基本操作
CPU 飚高
线上 CPU 飚高问题大家应该都遇到过,那么如何定位问题呢?
思路:首先找到 CPU 飚高的那个 Java 进程,因为你的服务器会有多个 JVM 进程。然后找到那个进程中的 “问题线程”,最后根据线程堆栈信息找到问题代码。最后对代码进行排查。
如何操作呢?
通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID。
再次通过 top -Hp [进程 ID] 找到 CPU 消耗最高的线程 ID,并记住线程 ID.
通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中。具体命令:jstack -l [进程 ID] >jstack.log。
由于刚刚的线程 ID 是十进制的,而堆栈信息中的线程 ID 是16进制的,因此我们需要将10进制的转换成16进制的,并用这个线程 ID 在堆栈中查找。使用 printf "%x\n" [十进制数字] ,可以将10进制转换成16进制。
通过刚刚转换的16进制数字从堆栈信息里找到对应的线程堆栈。就可以从该堆栈中看出端倪。
从楼主的经验来看,一般是某个业务死循环没有出口,这种情况可以根据业务进行修复。还有 C2 编译器执行编译时也会抢占 CPU,什么是 C2编译器呢?当 Java 某一段代码执行次数超过10000次(默认)后,就会将该段代码从解释执行改为编译执行,也就是编译成机器码以提高速度。而这个 C2编译器就是做这个的。如何解决呢?项目上线后,可以先通过压测工具进行预热,这样,等用户真正访问的时候,C2编译器就不会干扰应用程序了。如果是 GC 线程导致的,那么极有可能是 Full GC ,那么就要进行 GC 的优化。
最新文章
- eclipse中怎么用cmd
- 如何搭建一个linux服务器
- Python: 什么是*args和**kwargs
- 如何调试什么时候SaveFileDialog会被Dispose
- Java实现生产者消费者问题与读者写者问题
- HTTP代理与SPDY协议(转)
- 2299 Ultra-QuickSort(归并)
- 每周分享一 之 webSocket
- 学习pthreads,给线程传递多个参数
- selenium的一些使用方法
- Centos7安装jexus,部署asp.net core,asp.net mvc
- Creating and using a blendspace in c++
- kettle在centos7下部署分布式集群
- Camera2点击对焦实现2
- SCU 4437 Carries(二分乱搞)题解
- hammer.js方法总结(只做了一个简单的demo)
- SSH配置文件详解
- make install 时指定安装路径
- 认识J2EE规范或标准以及J2EE和JEE有什么不同?
- Dijkstra学习笔记