运行时性能问题的首要指标之一是来自 JVM 分析器或 Java 监视工具的高 Java CPU 使用率报告。 然而,和Linux上Java CPU利用率高的问题并不总是那么容易解决。

例如,如果应用程序过度分配实例,则当对象引用超出范围时,垃圾收集器 (GC) 将被迫采取行动。 越来越频繁的 GC 周期不仅会触发 JVM stop-the-world 事件,使应用程序显得无响应,还会导致 Java CPU 使用率飙升。 GC 问题的纠正与实施更高效的算法或逻辑工作流程无关。 解决方案是解决底层对象分配问题,该问题使用内存效率低下并触发不必要的GC。

Java CPU 指标可能会产生误导

具有争用问题的阻塞线程也可能导致 JVM 分析器工具报告 100% Java CPU 使用率。 并发问题和死锁并不是真正的处理器问题,而是线程如何分配以及它们访问的方法是同步还是阻塞的问题。

CPU 利用率也可能是一个误导性的指标。

当 CPU 空闲时,它会将其状态报告为未使用,因为它没有执行任何工作。 但是,当线程被阻塞时,它们会将 CPU 置于等待状态。 CPU 在处于等待状态时不执行任何逻辑,但它会向 JVM 分析工具报告它很忙,尽管它什么也不做。

另外,不要仅仅因为您的硬件报告 100% CPU 使用率就认为是 JVM 造成的。 当您的应用程序处于负载状态时,CPU 使用率可能会出现峰值,但该峰值可能是由于系统进程或软件堆栈的配置错误造成的。 如果服务器的虚拟内存配置错误,页面文件抖动将消耗大部分 CPU 周期。 团队或系统管理员需要解决虚拟内存问题,这不是您的应用程序或您如何调优 JVM 性能引起的问题。

cpu100%使用率_cpu使用率100_cpu使用率100有害处吗

最常见的 Java 性能问题

大多数 JVM 性能问题都可以追溯到 I/O 操作,例如写入文件系统或与后端关系数据库管理系统或消息队列交互。 配置错误的数据库连接池(其中不断创建和销毁资源以向基于 JPA 的应用程序提供 Java 数据库连接)可能会引发高 Java CPU 使用率。 不良的 I/O 资源管理也会导致内存泄漏,而且这是不可避免的。

Java CPU 使用率高的另一个误导性来源是设计不当的 API,它对其他服务进行了过多的网络调用。 具有大量 HTTP 请求的聊天应用程序以及每个请求-响应周期中解析 JSON 和 XML 的相关开销通常会触发 100% Java CPU 使用率报告。 随着开发人员将软件整体重新构建为微服务,这个问题在现代企业架构中变得越来越普遍。

Java CPU 使用率高的外围原因

JVM 内存管理不佳;

Java GC配置不正确;

问题更准确地归因于软件堆栈;

线程同步、争用和死锁问题;

低级文件和数据库 I/O 问题。

仅当根本原因分析消除了导致 Java CPU 使用率高问题的潜在原因后,才应花时间对代码中的潜在问题进行故障排除。

Java CPU占用率高的直接原因

当您的 Java 代码给 CPU 带来太大压力时,罪魁祸首可能是什么? Java CPU 使用率高问题的最常见、直接可归因的原因包括:

无限循环

无论是栅栏错误还是草率的开发,程序员启动循环并错误地编写破坏循环的条件的情况并非闻所未闻。 结果是一个无限循环,除了消耗时钟周期之外什么也不做。 如果多个线程访问这行代码,您的多线程应用程序将毫无意义地进行迭代。 消除无限循环,CPU 使用率应该恢复正常。

cpu使用率100有害处吗_cpu使用率100_cpu100%使用率

工作流程和算法写得不好

CPU 执行逻辑。 如果应用程序包含编写得不好的工作流程,并且代码像意大利面条一样连接起来,那么您的 CPU 将消耗不必要的时钟周期。 更新常用的工作流程并重新设计性能不佳的算法,以充分利用您的 CPU。

递归逻辑

虽然一些编程语言针对递归逻辑进行了优化,但 Java 不是其中之一。 递归算法创建难以打破的线程,它们分配不容易被垃圾收集算法回收的对象,并且它们创建难以展开的 Java 堆栈帧塔。 考虑到迫在眉睫的威胁,迭代递归算法并不难实现。

集合类选择不当

列表处理是大多数企业应用程序的核心。 因此,开发者有很多集合类可供选择。 如果开发人员选择在大型数据集上使用,CPU 利用率将会飙升。 同样,如果开发人员选择使用旧时钟周期,同步可能会不必要地消耗时钟周期。 选择错误的 Java 集合类,应用程序性能将会受到影响。 选择正确的集合类,Java CPU 使用率高的问题就会消失。

重新计算计算值

在整个应用程序中多次计算给定值的情况并不罕见。 如果是这种情况,请将第一次计算的结果保存在变量中,并在以后的所有交互中引用该变量。 像这样的小变化可能会对应用程序性能产生重大影响,特别是在涉及加密、图形操作或其他 CPU 密集型操作时。

借助分析工具(如适用于 Java 的良好 JVM 分析器和可用于检查结果的 JDK 工具),识别高 Java CPU 使用率问题的罪魁祸首应该不成问题。 一旦确定,找到解决方案只需实施新的软件例程并测试结果,直到问题得到解决。

好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注