问题

无限循环的while会导致CPU使用率飙升吗?

经常使用Young GC会导致CPU占用率飙升吗?

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

CPU使用率高的应用程序的线程数是多少?

处于BLOCKED状态的线程会导致CPU使用率飙升吗?

分时操作系统中的CPU是消耗us还是sy?

思路

1.如何计算CPU使用率?

CPU%= 1 - idleTime / sysTime * 100

idleTime: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资源,并且无限循环将继续向系统请求时间片,直到系统没有空闲时间来执行任何其他操作。

stackoverflow中也提出了这个问题:为什么无意的无限循环增加了CPU的使用?

2.频繁的Young GC会导致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导出了线程栈信息。

进一步检查日志:

onsumer_ODC_L_nn_jmq919_1543834242875 - priority:10 - threadid:0x00007fbf7011e000 - nativeid:0x2f093 - state:RUNNABLE

stackTrace:

java.lang.Thread.State:RUNNABLE

at java.lang.Object.hashCode(Native Method)

at java.util.HashMap.hash(HashMap.java:362)

at java.util.HashMap.getEntry(HashMap.java:462)

at java.util.HashMap.containsKey(HashMap.java:449)

at com.project.order.odc.util.XmlSerializableTool.deSerializeXML(XMLSerializableTool.java:100)

at com.project.plugin.service.message.resolver.impl.OrderFinishMessageResolver.parseMessage(OrderFinishMessageResolver.java:55)

at com.project.plugin.service.message.resolver.impl.OrderFinishMessageResolver.parseMessage(OrderFinishMessageResolver.java:21)

at com.project.plugin.service.message.resolver.impl.AbstractResolver.resolve(AbstractResolver.java:28)

at com.project.plugin.service.jmq.AbstractListener.onMessage(AbstractListener.java:44)

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

java进程cpu使用率高_什么会导致Java应用程序的CPU使用率飙升?相关推荐

  1. java cpu io高_服务器负载过高问题分析-不是cpu高负载也不是IO负载如何处理(阿里 几乎是必考题)...

    关于top命令 经常问load average 参考:load average 定义(网易面试) 问题现象: 1,top命令查询服务器负载达到2.0-5之间,tomcat的cpu使用率达到104% l ...

  2. svchost占用内存过高_是什么导致你的Java服务器内存和CPU占用过高呢

    一.内存占用过高 1.造成服务器内存占用过高只有两种情况:内存溢出或内存泄漏 (1)内存溢出:程序分配的内存超出物理内存的大小,导致无法继续分配物理内存,出现OOM报错. (2)内存泄漏:不再调用的对 ...

  3. json.tojsonstring 导致cpu飙高_阿里调试神器立功了!进程导致Kubernetes节点CPU飙高的排查与解决...

    来源:https://www.cnblogs.com/maxzhang1985/p/12673160.html 一.发现问题 在一次系统上线后,我们发现某几个节点在长时间运行后会出现CPU持续飙升的问 ...

  4. 物理内存是什么是计算机的显卡内存吗,物理内存使用率过高_任务管理器里的物理内存是什么,CPU使用率很低,但......

    电脑物理内存使用率很高怎么回事 这种情况说明主机内存过小或者系统没有经过优化. 一.首先从硬件入手,添加内存是最直接的解决方法,如果内存低于4G那么还是建议添加内存,这样才能根本解决问题. 二.排除内 ...

  5. java 进程 突然死掉_一次 java 进程猝死的原因分析

    问题 Java进程在服务器中运行一段时间,服务不稳定,偶尔出现进程无故的死亡.临时的办法是重启进程,但过一段时间后又无故死亡.没有任何 jvm oom的错误信息. 路径 1.通过jvm监控查看jvm监 ...

  6. java进程里面调用方法_在java里面调用CUI程序的方法

    在java里面调用CUI程序的方法推荐查看本文HTML版本 在java里面调用CUI程序的方法 问题描述: 该函数在win平台上面调用不是很成功,GUI会可以调出来,但可能和屏蔽调其中的一些用 ...

  7. java中审核订单流程图_看95后java妹子横扫阿里,京东,小米,滴滴,美团等大厂,一份热腾腾的面经(最终入职阿里)...

    内容目录 头条 美团 滴滴 京东 others 算法题 HR面 tips 自序 这次面试的公司有一点点多,主要是因为毕业后前两份工作找的都很草率,这次换工作就想着,emm,毕业三年了,该找个工作好好沉 ...

  8. java编写代码用什么_如何学习用Java编写代码:为什么要学习以及从哪里开始

    java编写代码用什么 by John Selawsky 约翰·塞劳斯基(John Selawsky) 如何学习用Java编写代码:为什么要学习以及从哪里开始 (How to learn to cod ...

  9. java中二进制怎么说_面试:说说Java中的 volatile 关键词?

    volatile 这个关键字可能很多朋友都听说过,或许也都用过.在 Java 5 之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 Java 5之后,volatile 关 ...

最新文章

  1. git server安装
  2. SpringMVC基础配置及使用
  3. rhino4.0安装教程
  4. linux kernel基本构成的内容有下列哪些项_Linux_GUI加速(2)_Linux中的DRM-KMS分析
  5. 解读三组容易混淆的Dockerfile指令
  6. Sublime Text 3 无法输入中文解决方案
  7. Lesson 04 for Plotting in R for Biologists
  8. mysql gtidpurged_gtid环境下mysqldump对于set-gtid-purged的取值
  9. FH153C6常用一键开关机芯片 ON/OFF单键开关IC 美容仪电子开关IC
  10. 你知道JavaScript的继承有几种写法吗?
  11. Python使用string.Formatter()制作打印模板
  12. 2017携程java后台开发工程师暑期实习生招聘面试经验分享
  13. NVIDIA,怎么查看显卡
  14. Linux centos7 搭建k8s集群步骤详解
  15. Unity3D GUI Skin
  16. Markdown笔记利器:Typora主题-最美的模板
  17. Java入门视频教程(三)4 Java基本语法------分支流程
  18. IFS系统功能清单之一——IFS通用组件
  19. siesta在Linux运行,siesta在centos下编译问题
  20. 怎样禁止系统的信使服务(转)

热门文章

  1. 二进制数据(Image类型)从一个表存入另一个表
  2. 三层交换机如何配置?如何实现不同vlan间的通信?
  3. ELK收集docker日志
  4. NGINX:nginx精准禁止特定国家或者地区IP访问
  5. CSS webkit
  6. 解决WORD文档无法显示链接的图像问题
  7. C++异常 调用abort()
  8. Nginx完美解决前后端分离端口号不同导致的跨域问题
  9. tomcat启动后,页面浏览时报错 Unable to compile class for JSP的解决方案
  10. VS2010调试窗口一闪而过解决方法