JVM 线上故障排查基本操作

CPU 飚高

线上 CPU 飚高问题大家应该都遇到过,那么如何定位问题呢?

思路:首先找到 CPU 飚高的那个 Java 进程,因为你的服务器会有多个 JVM 进程。然后找到那个进程中的 “问题线程”,最后根据线程堆栈信息找到问题代码。最后对代码进行排查。

如何操作呢?

  1. 通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID。

  2. 再次通过 top -Hp [进程 ID] 找到 CPU 消耗最高的线程 ID,并记住线程 ID.

  3. 通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中。具体命令:jstack -l [进程 ID] >jstack.log。

  4. 由于刚刚的线程 ID 是十进制的,而堆栈信息中的线程 ID 是16进制的,因此我们需要将10进制的转换成16进制的,并用这个线程 ID 在堆栈中查找。使用 printf "%x\n" [十进制数字] ,可以将10进制转换成16进制。

  5. 通过刚刚转换的16进制数字从堆栈信息里找到对应的线程堆栈。就可以从该堆栈中看出端倪。

从楼主的经验来看,一般是某个业务死循环没有出口,这种情况可以根据业务进行修复。还有 C2 编译器执行编译时也会抢占 CPU,什么是 C2编译器呢?当 Java 某一段代码执行次数超过10000次(默认)后,就会将该段代码从解释执行改为编译执行,也就是编译成机器码以提高速度。而这个 C2编译器就是做这个的。如何解决呢?项目上线后,可以先通过压测工具进行预热,这样,等用户真正访问的时候,C2编译器就不会干扰应用程序了。如果是 GC 线程导致的,那么极有可能是 Full GC ,那么就要进行 GC 的优化。

最新文章

  1. eclipse中怎么用cmd
  2. 如何搭建一个linux服务器
  3. Python: 什么是*args和**kwargs
  4. 如何调试什么时候SaveFileDialog会被Dispose
  5. Java实现生产者消费者问题与读者写者问题
  6. HTTP代理与SPDY协议(转)
  7. 2299 Ultra-QuickSort(归并)
  8. 每周分享一 之 webSocket
  9. 学习pthreads,给线程传递多个参数
  10. selenium的一些使用方法
  11. Centos7安装jexus,部署asp.net core,asp.net mvc
  12. Creating and using a blendspace in c++
  13. kettle在centos7下部署分布式集群
  14. Camera2点击对焦实现2
  15. SCU 4437 Carries(二分乱搞)题解
  16. hammer.js方法总结(只做了一个简单的demo)
  17. SSH配置文件详解
  18. make install 时指定安装路径
  19. 认识J2EE规范或标准以及J2EE和JEE有什么不同?
  20. Dijkstra学习笔记

热门文章

  1. MacOS查看NGINX文件路径(配置文件、日志文件)
  2. 与你一起学习MS Project——理论篇:项目管理与Project
  3. Spring源码窥探之:@Profile
  4. 深入理解JVM内存分配和常量池
  5. 图书检索系统C版本
  6. NTSTATUS代码摘录
  7. 洛谷P2659 美丽的序列
  8. C博客作业01--分支顺序结构
  9. 京东Java架构师讲解购物车的原理及Java实现
  10. Linux环境下Nexus3.6安装