如何查找java应用程序中占用java进程cpu高的原因方法

无限循环的while会导致CPU使用率飙升吗
经常使用Young GC会导致CPU占用率飙升吗?
具有大量线程的应用程序的CPU使用率是否较高
CPU使用率高的应用程序的线程数是多少?
处于BLOCKED状态的线程会導致CPU使用率飙升吗
分时操作系统中的CPU是消耗us还是sy?

1.如何计算CPU使用率

  • sysTime:CPU处于用户模式和内核模式的时间总和

2.与CPU使用率有关的是什么?

人們常说计算密集型程序的CPU密集程度更高。

那么JAVA应用程序中的哪些操作更加CPU密集?

以下列出了常见的CPU密集型操作:

  • 频繁的GC;      如果访问量很高可能会导致频繁的GC甚至FGC。当调用量很大时内存分配将如此之快以至于GC线程将连续执行,这将导致CPU飙升

  • 序列化和反序列化。稍后将給出一个示例:当程序执行xml解析时调用量会增加,从而导致CPU变满

  • 正则表达式。 我遇到了正则表达式使CPU充满的情况; 原因可能是Java正则表达式使用的引擎实现是NFA自动机它将在字符匹配期间执行回溯。我写了一篇文章“ 正则表达式中的隐藏陷阱 ”来详细解释原因

  • 线程上下文切换; 有许多已启动的线程,这些线程的状态在Blocked(锁定等待IO等待等)和Running之间发生变化。当锁争用激烈时这种情况很容易发生。

  • 有些线程囸在执行非阻塞操作例如while (true)语句。如果在程序中计算需要很长时间则可以使线程休眠。

3. CPU是否与进程和线程相关

现在,分时操作系统使鼡循环方式为进程调度分配时间片如果进程正在等待或阻塞,那么它将不会使用CPU资源线程称为轻量级进程,并共享进程资源因此,線程调度在CPU中也是分时的但在Java中,我们使用JVM进行线程调度因此,通常线程调度有两种模式:时间共享调度和抢占式调度。

1. while的无限循環会导致CPU使用率飙升吗

首先,无限循环将调用CPU寄存器进行计数此操作将占用CPU资源。那么如果线程始终处于无限循环状态,CPU是否会切換线程

除非操作系统时间片到期,否则无限循环不会放弃占用的CPU资源并且无限循环将继续向系统请求时间片,直到系统没有空闲时间來执行任何其他操作

Young GC本身就是JVM用于垃圾收集的操作,它需要计算内存和调用寄存器因此,频繁的Young GC必须占用CPU资源

让我们来看一个现实卋界的案例。for循环从数据库中查询数据集合然后再次封装新的数据集合。如果内存不足以存储JVM将回收不再使用的数据。因此如果所需的存储空间很大,您可能会收到CPU使用率警报

3.具有大量线程的应用程序的CPU使用率是否较高?

如果通过jstack检查系统线程状态时线程总数很大但处于Runnable和Running状态的线程数不多,则CPU使用率不一定很高

我遇到过这样一种情况:系统线程的数量是1000+,其中超过900个线程处于BLOCKED和WAITING状态该线程占用很少的CPU。

但是大多数情况下如果线程数很大,那么常见的原因是大量线程处于BLOCKED和WAITING状态

4.对于CPU占用率高的应用程序,线程数是否较大

高CPU使用率的关键因素是计算密集型操作。如果一个线程中有大量计算则CPU使用率也可能很高。这也是数据脚本任务需要在大规模集群上運行的原因

5.处于BLOCKED状态的线程是否会导致CPU占用率飙升?

CPU使用率的飙升更多是由于上下文切换或过多的可运行状态线程处于阻塞状态的线程不一定会导致CPU使用率上升。

6.如果分时操作系统中CPU的值us或sy值很高这意味着什么?

您可以使用命令查找CPU的值us和sy值top如以下示例所示:

us:用戶空间占用CPU的百分比。简单来说高我们是由程序引起的。通过分析线程堆栈很容易找到有问题的线程
sy:内核空间占用CPU的百分比。当sy为高时如果它是由程序引起的,那么它基本上是由于线程上下文切换

如何找出CPU使用率高的原因?下面简要描述分析过程

如果发现应用程序服务器的CPU使用率很高,请首先检查线程数JVM,系统负载等参数然后使用这些参数来证明问题的原因。其次使用jstack打印堆栈信息并使鼡工具分析线程使用情况(建议使用fastThread,一个在线线程分析工具)

一天晚上,我突然收到一条消息说CPU使用率达到了100%。然后我用jstack导出了線程栈信息

现在通过这个日志找到了问题:用于反序列化MQ消息实体的方法导致CPU使用率飙升

关于java进程占用cpu问题一般都是想知道

  1. 哪个(些)线程使用了更多的cpu
  2. 哪个(些)方法使用了更多的cpu

本文给出一个非常简要的介绍并给出了各个方法的使用例子,更深入使用可参考相關文档 我觉得这些方法简单实用,已经帮助我解决过几次问题(产品环境过慢性能调优),希望对你也有帮助



  • 处理文件是我们每天最常見的任务之一。 Python具有几个用于执行文件操作的内置模块例如读取文件,移动文件获取...

我要回帖

更多关于 java进程cpu高的原因 的文章

 

随机推荐