在Java应用程序中的高CPU使用率 - 为什么?(High CPU Utilization in

2019-08-19 12:09发布

我有一个Java应用程序(基于Web),有时表现出很高的CPU使用率(近90%)几个小时。 Linux的TOP命令显示了这一点。 在应用程序重新启动,问题消失。

因此,要调查

我采取线程转储找到什么的线程在做什么。 多个线程在发现'RUNNABLE'状态,一些在其他几个州。 服用重复线程转储,我看到一些线程总是出现在'RUNNABLE'状态。 因此,他们似乎是罪魁祸首。

但我不能肯定地告诉,哪个线程占用CPU的或已经进入一个无限循环(从而导致高CPU使用率)。

日志并不一定帮助,因为有问题的代码可能无法登录任何东西。

如何调查-应用程序的哪一部分或什么的线程导致高CPU使用率? -任何其他的想法?

Answer 1:

如果探查并不适用于您的设置,您可以尝试找出以下步骤线程这个职位 。

基本上有三个步骤:

  1. 运行top -H并获得最高CPU线程的PID。
  2. 转换PID为十六进制。
  3. 寻找你的线程转储匹配HEX PID线程。


Answer 2:

你可能是一个垃圾收集问题的受害者。

当应用程序需要的内存和它越来越低的就是它的配置为使用垃圾收集器通常会大量消耗CPU周期的运行。 如果它不能收集什么东西你的记忆将保持低位,以将一次又一次地运行。 当您重新部署应用程序的内存被清除,垃圾收集不会发生比要求,因此CPU占用率保持为低电平,直到它充满一次以上。

你应该检查是否有您的应用程序没有可能的内存泄漏,它的配置以及内存(检查-Xmx参数,见什么的Java选项-Xmx代表什么? )

此外,您使用的web框架是什么? JSF依赖于会话了很多,占用了大量的内存,考虑最多是无状态的!



Answer 3:

在这些高峰CPU时间,是什么样的用户负载? 你说这是一个基于Web的应用程序,所以我想到的罪魁祸首就是内存利用率的问题。 如果存储了很多的东西在会话,例如,会话数得足够高,应用服务器将启动约抖动。 这也是在GC可能使事情变得更糟取决于你所使用的方案的情况。 有关应用程序和服务器配置的详细信息将是朝着更调试想法指点帮助。



Answer 4:

你的第一个做法应该是找到所有引用了Thread.sleep并检查:

  1. 睡眠是做正确的事-你应该使用某种等待机制如果可能的话-或许谨慎使用的BlockingQueue会有所帮助。

  2. 如果睡眠做正确的事情,你睡觉的时间适量-这往往是一个非常难以回答的问题。

在多线程设计中最常见的错误是相信你等着事情发生时,需要做的是在紧密循环,以检查它睡了一会儿。 这是很少见的有效解决方案-你应该总是试图wait的发生。

第二个最常见的问题是没有循环睡觉 。 这是更糟糕的,是有点不太容易跟踪。



Answer 5:

在线程转储,你可以找到行号如下。

主线程当前正在运行...

"main" #1 prio=5 os_prio=0 tid=0x0000000002120800 nid=0x13f4 runnable [0x0000000001d9f000]
   java.lang.Thread.State: **RUNNABLE**
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:313)
    at com.rana.samples.**HighCPUUtilization.main(HighCPUUtilization.java:17)**


Answer 6:

你没有指定的“Linux”的问题,但你提到的“Linux的顶部”。 因而这可能会有所帮助:

使用小型的Linux工具threadcpu找出最使用的CPU线程。 它要求jstack得到线程名。 并以“排序-n”在管你的CPU使用率排序线程的列表。

更多详细信息可以在这里找到: http://www.tuxad.com/blog/archives/2018/10/01/threadcpu_-_show_cpu_usage_of_threads/index.html

如果你还需要更多的细节,然后创建线程的线程转储或运行strace的。



文章来源: High CPU Utilization in java application - why?