什么问题让Java应用将CPU使用率飙升至100%吗?

问题

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

思路

1.如何计算cpu使用率?
CPU% = 1- idleTime/sysTime *100
idleTime:cpu空闲时间
sysTime:CPU处于用户模式和内核模式的时间总和
2、与cpu使用率有什么关系?
计算密集型程序的CPU密集程度高。
Java中哪些操作更加CPU密集?

  • 频繁的GC:如果访问量很高,会导致频繁的GC甚至FGC。当调用量大时间,内存分配将很快以至于GC线程连续执行,导致cpu飙升。
  • 序列化和反序列化。
  • 正则表达式:Java正则表达式使用的引擎实现是NFA自动机,在字符匹配期间进行回溯。
  • 线程的上下文切换:当线程在Blocked和Running之间发生变化时,锁竞争激烈,cpu消耗高。
  • 有些线程正在执行非阻塞操作,例如while(true)语句。如果程序计算需要很长时间,可以使线程休眠。
    3、CPU是否和进程线程有关?
    分时操作系统使用循环方式为进程调度分配时间片。如果进程阻塞或者等待,它将不会使用cpu资源。线程称之为轻量级进程,共享进程资源。线程调度在CPU中也是分时的,但在Java中,我们使用JVM进行线程调度。所以线程调度有两种模式:时间共享调度和抢占式调度。

答案

1、while的无限循环会导致CPU使用率飙升吗
会,无限循环将调用CPU寄存器进行计数,会占据cpu资源。
如果线程始终出无限循环,cpu是否会切换线程?
除非操作系统时间片到期,否者无限循环不会放弃占用CPU的资源,并且无限循环将继续向系统请求时间片,直到系统没有空闲时间来执行其他操作。
2、频繁GC会导致CPU占用率飙升?
会,Young GC本身就是JVM用于垃圾收集的操作,他需要计算内存和调用寄存器。Young GC也会占用CPU资源。
3、具有大量线程的应用程序的CPU使用率是否较高
不是,通过jstack检查系统线程状态时,线程总量很大,但处于Runnable和Running状态线程数不多,cpu使用率不一定高。
大多数情况下,如果线程数很大,那么常见的原因是大量线程处于BLOCKED和WAITING状态。
4、CPU占用率高的应用程序,线程数是否较大?
不是,高CPU使用率的关键因素是计算密集型操作。如果一个线程中有大量的计算,CPU使用率也会很高。这也是数据脚本任务需要在大规模集群上运行的原因。
5、处于Blocked状态的线程是否会导致CPU占用率过高?
不会,CPU使用率过高更多是因为上下文切换或者过多的可运行状态的线程。
6、如果分时操作系统中的CPU的值us或者sy值很高,这意味着什么?
可以使用相关命令查找CPU的us和sy。
us:用户空间占用cpu的百分比,由我们程序引起的高,通过线程堆栈来找到问题
sy:内核空间占用CPU的百分比,由我们程序引起的高,基本是由上下文切换引起的。

排查问题过程:
如果发现应用程序服务器的CPU使用率很高,首先检查线程数,JVM,系统负载等,然后使用这些参数来找到问题的原因。其次使用jstack等工具来打印堆栈信息并使用工具分析线程情况。

你可能感兴趣的:(什么问题让Java应用将CPU使用率飙升至100%吗?)