Java服务CPU100%异常排查实践总结

简介: 写作目的最近看牛客网发现了CPU 100% 怎么办这个问题,这个问题的重点是定位和解决,会用到Linux和java的的很多命令,所以写篇博客记录和总结一下。

CPU 100%复现


之前有一个1核的腾讯云服务器,正好就不用搞虚拟机了。

写一个死循环Service


@Service
public class Cpu100Service {
  public void cpu100() {
    int a = 10;
    while (a < 100) {
      System.out.println(LocalDateTime.now().toString());
    }
  }
}


在controller中调用该Service就复现了。


  @Autowired
  private Cpu100Service cpu100Service;
@GetMapping("/cpu100")
  public Object getWhileList() {
    cpu100Service.cpu100();
    return 1;
  }


在服务器上启动服务后调用死循环的接口,则CPU出现负载100%的情况


3.png


定位问题


定位高负载的进程服务


首先使用top命令确认服务器的具体情况,定位到高负载的进程服务,如下图所示,我发现PID为929的服务CPU那栏高达86%,初步定位到是这个PID为929服务有问题。


5.png


定位到具体的线程


通过上面我们可以定位的进程的ID为929,接下来我们要定位到该进程的哪个线程占用CPU比较高,使用如下命令,其中929为进程ID。


top -Hp 929


6.png


定位线程调用栈


通过以下命令把定位的进程线程调用栈保存下来,其中929为进程ID


jstack 929 > 929.log


下图为929.log的部分信息,其中我们知道进程中线程号(十进制1141,十六进制475)占用CPU比较高,我们可以通过线程ID的十六进制定位到线程,然后根据调用栈定位信息,发现定位到我们自己写的代码,然后在捋一捋自己代码的逻辑就好。


7.png

目录
相关文章
|
3天前
|
Java 编译器
Java一分钟之——异常分类:检查异常与运行时异常
【5月更文挑战第20天】Java异常处理分为检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions),两者在编译期处理方式不同。检查异常需捕获或声明,如`IOException`,而运行时异常如`NullPointerException`在运行时终止程序。常见问题包括不恰当的异常使用、过度捕获和忽略异常信息。避免策略包括正确区分异常类型、具体捕获和处理异常信息。示例代码展示了如何处理这两种类型的异常。理解并妥善处理异常能提升程序的健壮性和可维护性。
27 4
|
1天前
|
Java
【JAVA学习之路 | 提高篇】自定义异常类
【JAVA学习之路 | 提高篇】自定义异常类
|
1天前
|
Java
【JAVA学习之路 | 提高篇】异常的处理(throws)与手动抛出异常(throw)
【JAVA学习之路 | 提高篇】异常的处理(throws)与手动抛出异常(throw)
|
1天前
|
Java 编译器 数据库连接
【JAVA学习之路 | 提高篇】异常的处理(try-catch-finally)
【JAVA学习之路 | 提高篇】异常的处理(try-catch-finally)
|
1天前
|
运维 Java 程序员
【JAVA学习之路 | 提高篇】异常(Exception)
【JAVA学习之路 | 提高篇】异常(Exception)
|
2天前
|
Java API
Java中的多线程编程:从理论到实践
【5月更文挑战第21天】 在现代软件开发中,多线程编程是一个不可或缺的技术,特别是在Java这种广泛使用的编程语言中。本文将深入探讨Java中的多线程编程,从基本概念到高级应用,包括线程的创建、同步、通信以及并发集合等。我们将通过实例和代码片段来说明这些概念,并提供一些最佳实践和注意事项,以帮助读者更好地理解和应用Java多线程编程。
|
2天前
|
Java API 数据库
利用Java构建高性能的RESTful Web服务
在现代软件开发中,RESTful Web服务已成为一种流行的架构模式,用于构建可扩展、可维护的网络应用。本文将探讨如何使用Java编程语言及其相关框架(如Spring Boot)来构建高性能的RESTful Web服务。我们将不仅仅关注基本的RESTful API设计,还将深入讨论性能优化、安全性、以及服务扩展性等方面的技术细节。通过本文,读者将能够掌握构建高效RESTful Web服务的核心技术和实践。
|
2天前
|
Java 调度 开发者
Java中的多线程编程:理解与实践
【5月更文挑战第21天】 在现代软件开发中,多线程编程是提高程序性能和响应能力的重要手段。Java语言提供了丰富的多线程支持,使得开发者能够创建和管理多个线程,以实现并行处理和资源共享。本文将深入探讨Java中的多线程编程,包括线程的创建、同步机制、死锁问题以及线程池的使用等方面,帮助读者全面理解Java多线程编程的原理与实践。
|
3天前
|
Java
Java一分钟之——异常链:追踪错误源头
【5月更文挑战第20天】Java异常处理中的异常链机制有助于追踪错误源头。通过`initCause()`和`getCause()`方法,新异常与原始异常关联,提供丰富调试信息。常见问题包括忽略原始异常、过度包装和不正确调用`initCause()`。避免策略包括始终记录原始异常、适度创建自定义异常和正确使用`initCause()`。代码示例展示了如何在异常实例化时自动链接原始异常。异常链能改善错误追踪,加速问题解决。
26 3
|
4天前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【5月更文挑战第19天】多线程编程是Java中的一个重要概念,它允许程序员在同一时间执行多个任务。本文将介绍Java多线程的基础知识,包括线程的创建、启动和管理,以及如何通过多线程提高程序的性能和响应性。

热门文章

最新文章