您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

如何解决高 Java CPU 使用率问题

时间:2022-03-04 11:28:55  来源:  作者:粤嵌教育

运行时性能问题的首要指标之一是来自 JVM 分析器或 JAVA 监控工具的高 Java CPU 使用率报告。但是,windows 和 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 周期。DevOps 团队或系统管理员需要解决虚拟内存问题,这不是由你的应用程序或你如何调整 JVM 性能造成的问题。

 

如何解决高 Java CPU 使用率问题

最常见的 Java 性能问题

 

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

 

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

 

Java CPU 使用率高的外围原因

 

糟糕的 JVM 内存管理;

Java GC 配置不当;

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

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

底层文件和数据库 I/O 问题。

 

只有在根本原因分析消除了这些问题作为高 Java CPU 使用问题的潜在原因之后,才应该花时间对代码中的潜在问题进行故障排除。

 

Java CPU 使用率高的直接原因

 

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

 

无限循环

 

无论是栅栏错误还是草率的开发,程序员开始循环并错误地编码打破它的条件并不是闻所未闻的。结果是一个除了消耗时钟周期之外什么都不做的无限循环。如果有多个线程访问这行代码,那么你的多线程应用程序只会进行无意义的迭代。消除无限循环,CPU 使用应该恢复正常。

 

如何解决高 Java CPU 使用率问题

写得不好的工作流程和算法

 

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

 

递归逻辑

 

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

 

选择不当的集合类

 

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

 

重新计算已计算的值

 

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

 

借助 Java Flight Recorder 之类的良好 JVM 分析器以及可用于检查结果的 JDK Mission Control 工具之类的分析工具,确定导致 Java CPU 使用率过高问题的罪魁祸首应该不是问题。一旦确定,找到修复只是实施新的软件例程并测试结果直到修复的问题。



Tags:CPU 使用率   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  Search: CPU 使用率  点击:(22)  评论:(0)  加入收藏
线上环境 CPU 使用率飙升如何快速排查?
这里就不麻烦地建 Web 项目了,用一个最原始的 Java 项目来模拟高 CPU 场景。打开 IDEA,创建一个 Java 项目,里面写一个死循环,循环里面不断地创建对象。相比于一大堆复杂的 JVM...【详细内容】
2023-03-06  Search: CPU 使用率  点击:(375)  评论:(0)  加入收藏
如何解决高 Java CPU 使用率问题
运行时性能问题的首要指标之一是来自 JVM 分析器或 Java 监控工具的高 Java CPU 使用率报告。但是,Windows 和 Linux 上的高 Java CPU 利用率问题并不总是容易解决。 例如,如...【详细内容】
2022-03-04  Search: CPU 使用率  点击:(398)  评论:(0)  加入收藏
怎样优化一个 Go 服务以减少 40% 的 CPU 使用率?
10 年前,谷歌遇到一个由 C++ 编译时间过长造成的严重瓶颈,他们需要全新的解决方案。为应对这一挑战,谷歌工程师创建了一种叫 Go(又名 Golang)的新编程语言。Go 语言借鉴了 C++ 的...【详细内容】
2020-06-12  Search: CPU 使用率  点击:(412)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(17)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(25)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(29)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(60)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(76)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(75)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(95)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(111)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(102)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(81)  评论:(0)  加入收藏
站内最新
站内热门
站内头条