java 正则 cpu 100_这六个原因真的可以使Java应用程序的CPU使用率飙升到100%吗?...

affe5a48a918243e023b36409635e869.png

点击上方的“代码农户的冥想记录”,然后选择“设为明星”

高质量文章,及时交付

问题

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

想法1.如何计算CPU使用率?

CPU%= 1-idleTime / sysTime * 100

idleTime: CPU空闲时间

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

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

b0aadd5a6139ebf0b1962fb228ba463c.png

通常会说计算密集型程序对CPU的占用更大.

那么,JAVA应用程序中的哪些操作会占用更多的CPU资源?

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

1. 频繁的GC;如果访问次数很高,可能会导致频繁的GC甚至FGC. 当调用量很大时,内存分配将非常快,以至于GC线程将连续执行,这将导致CPU激增. 2.序列化和反序列化. 稍后将给出一个示例: 当程序执行xml解析时,调用量将增加,从而导致CPU变满. 3.序列化和反序列化; 4.正则表达式. 我遇到过这样的情况,正则表达式填满了CPU;原因可能是Java正则表达式使用的引擎实现是NFA自动机,它将在字符匹配期间执行回溯. 5.线程上下文切换;有许多启动线程,并且这些线程的状态在“阻塞”(锁定等待,IO等待等)和“运行”之间改变. 当锁争用很激烈时,这种情况很容易发生. 6.一些线程正在执行非阻塞操作,例如while(true)语句. 如果程序中的计算需要很长时间,则可以使线程进入睡眠状态.

3. CPU与进程和线程有关吗?

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

答案1. while的无限循环会导致CPU使用率猛增吗?

是的

首先,无限循环将调用CPU寄存器进行计数,此操作将占用CPU资源. 那么,如果线程始终处于无限循环中,CPU会切换线程吗?

dbfb54ce8cf7056bd43724fa5e26b7b9.png

除非操作系统时间片到期,否则无限循环将不会放弃占用的CPU资源,并且无限循环将继续向系统请求时间片,直到系统没有空闲时间来执行任何其他操作. 改组: 微信公众号,搜云技术团队,ID: 搜云

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. 处于阻塞状态的线程会导致CPU使用率飙升吗?

否.

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

6. 如果分时操作系统中的CPU值us或sy很高,那是什么意思?

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

us: 用户空间占用的CPU百分比. 简而言之,我们的高额消费是由程序造成的. 通过分析线程堆栈很容易找到有问题的线程. 改组: 微信公众号,搜云技术团队,ID: 搜云

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(NativeMethod)

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使用率猛增.

新年快乐,祝福,祝你好运和问候. 祝您新年快乐,事业愉快;幸福永远存在,好心情永远美好;快乐永远是持续的,生活总是美好的,注意一点,然后再看.

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/shoujiruanjian/article-301462-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值