【性能优化】CPU利用率飙高与内存飙高问题

news2024/9/22 15:36:31

📫作者简介:小明java问道之路2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。

        

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

        

🏆 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人

🏆 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家

        

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 


🍅 文末获取联系 🍅  👇🏻 精彩专栏推荐订阅收藏 👇🏻

专栏系列(点击解锁)

学习路线(点击解锁)

知识定位

🔥Redis从入门到精通与实战🔥

Redis从入门到精通与实战

围绕原理源码讲解Redis面试知识点与实战

🔥MySQL从入门到精通🔥

MySQL从入门到精通

全面讲解MySQL知识与企业级MySQL实战

🔥计算机底层原理🔥

深入理解计算机系统CSAPP

以深入理解计算机系统为基石,构件计算机体系和计算机思维

Linux内核源码解析

围绕Linux内核讲解计算机底层原理与并发

🔥数据结构与企业题库精讲🔥

数据结构与企业题库精讲

结合工作经验深入浅出,适合各层次,笔试面试算法题精讲

🔥互联网架构分析与实战🔥

企业系统架构分析实践与落地

行业最前沿视角,专注于技术架构升级路线、架构实践

互联网企业防资损实践

互联网金融公司的防资损方法论、代码与实践

🔥Java全栈白宝书🔥

精通Java8与函数式编程

本专栏以实战为基础,逐步深入Java8以及未来的编程模式

深入理解JVM

详细介绍内存区域、字节码、方法底层,类加载和GC等知识

深入理解高并发编程

深入Liunx内核、汇编、C++全方位理解并发编程

Spring源码分析

Spring核心七IOC/AOP等源码分析

MyBatis源码分析

MyBatis核心源码分析

Java核心技术

只讲Java核心技术

本文目录

本文导读

一、CPU利用率飙高问题

1、CPU利用率飙高定位步骤

2、CPU飙高的原因

3、CPU飙高的解决方法

二、内存飙高问题

1、内存飙高定位步骤

2、内存飙高故障分析及解决

2.1、进程占用太多的内存

2.2、缓存占用过高导致内存不足

2.3、内存泄漏和内存溢出

总结


本文导读

本文对CPU利用率飙高问题,内存飙高问题进行剖析。主要内容有CPU利用率飙高定位步骤、CPU飙高的原因与解决;内存飙高定位步骤以及内存飙高故障分析及解决。

一、CPU利用率飙高问题

1、CPU利用率飙高定位步骤

当cpu经常飙升到100%的使用率,需要定位到具体是哪个线程在占用,定位问题的步骤如下(linux系统):

1、使用top命令常看当前服务器中所有进程(jps命令可以查看当前服务器运行java进程),找到当前cpu使用率最高的进程,获取到对应的pid;

2、然后使用top -Hp pid,查看该进程中的各个线程信息的cpu使用,找到占用cpu高的线程pid。

3、使用jstack pid打印它的线程信息,通过jstack命令打印的线程号和通过top -Hp打印的线程号进制不一样,需要进行转换才能进行匹配,jstack中的线程号为16进制,而top -Hp打印的是10进制。

使用 jastack 命令分析线程信息的时候需要关注线程对应的运行状态:runnable代表当前线程正在运行,waiting代表当前线程正在等待,该状态需要进行特殊关注wait fot 后面的线程号,因为如果当前处于waiting状态的程序长时间处于等待状态,那么就需要知道它在等待哪个线程结束,也就是wait for后面的线程号,然后根据线程号找到对应的线程,去查看当前线程有什么问题。

2、CPU飙高的原因

1、无限循环或死循环:程序中存在错误的循环结构,导致程序一直在循环执行,从而消耗大量的CPU资源。

2、复杂的算法和计算:程序中执行复杂的算法、大规模的数据处理或者需要大量计算的操作可能导致CPU占用过高。

2、频繁的IO操作:如果程序频繁地进行文件读写、网络通信等IO操作,可能会导致CPU占用增加。

3、线程问题:多线程程序中,线程可能因为竞争条件、死锁、阻塞等问题导致CPU占用过高。

4、内存问题:内存泄漏或内存占用过高可能导致Java虚拟机频繁进行垃圾回收,从而增加CPU负担。

5、不合理的资源管理:没有正确释放或管理资源,如打开的文件、数据库连接等,可能导致CPU占用过高。

6、第三方库或框架问题:使用的第三方库、框架或组件可能存在性能问题,导致程序CPU占用增加。

7、并发问题:不正确的并发控制或同步机制可能导致竞争条件和性能问题。

8、缓存问题:缓存未有效利用,导致程序频繁地从内存或磁盘读取数据,增加了CPU负担。

9、频繁的异常处理:频繁的异常处理可能会导致CPU占用过高,因为异常处理可能会涉及昂贵的堆栈跟踪等操作。

3、CPU飙高的解决方法

1、优化代码:检查代码(code review),优化算法、循环和IO操作,减少CPU负担。

2、线程管理:确保多线程程序中的线程正确管理,避免竞争条件和死锁。

3、内存管理:检查内存泄漏,确保释放不再使用的内存。

4、使用合适的工具:使用性能分析工具来检测CPU占用过高的具体位置和原因。

二、内存飙高问题

内存飙高一般都是堆中对象无法回收造成,因为java中的对象大部分存储在堆内存中。其实也就是常见的oom问题(Out Of Memory)。

查看内存状态的命令(top、free、vmstat,sar,/proc/meminfo)

导致内存不足的三个原因进行占用太高、缓存占用过高没有进行释放、内存泄漏和内存溢出导致内存不足

1、内存飙高定位步骤

1.jinfo pid,可以查看当前进行虚拟机的相关信息列举出来

2.jstat -gc pid ms,多长毫秒打印一次gc信息,打印信息如下,里面包含gc测试,年轻代/老年带gc信息等:

3.jmap -histo pid | head -20,查找当前进程堆中的对象信息,jmap -dump:format=b,file=xxx pid,可以生成堆信息的文件,但是这个命令不建议在生产环境使用,因为当内存较大时,执行该命令会占用大量系统资源,甚至造成卡顿。

在项目启动时添加下面的命令,在发生oom时自动生成堆信息文件:-XX:+HeapDumpOnOutOfMemory。如果需要在线上进行堆信息分析,如果当前服务存在多个节点,可以下线一个节点,生成堆信息,或者使用第三方工具,阿里的arthas。

2、内存飙高故障分析及解决

2.1、进程占用太多的内存

原因:每当对磁盘进行读写操作时,都会先对缓存进行操作,因为缓存是需要消耗内存的,虽然缓存中的内存会自动释放,但是只有当物理空闲内存不够的时候,缓存中才会释放一些内存出来,释放的也仅仅是够用,不会全部释放。

解决办法:使用top命令查看哪个进程占用太多,进行内存排序,kill掉

2.2、缓存占用过高导致内存不足

同进程占用太多的内存处理

2.3、内存泄漏和内存溢出

内存泄漏:程序在申请内存后,无法释放,会导致内存空间不足。

内存溢出:程序申请内存时,没有足够的空间供其使用,出现内存溢出。(解决:检查错误日志,修改JVM启动参数,增加内存,)

内存溢出的原因:内存中加载的数据过于庞大,如一次从数据库读取过多的数据,内存供给不足,导致内存溢出;集合类中有对对象的引用,使用完后未清空,使得JVM(运行java代码的容器,相当于一台java虚拟机)不能回收;代码中存在死循环或循环产生过多重复的对象实体;启动参数内存设定的过小。

总结

本文对CPU利用率飙高问题,内存飙高问题进行剖析。主要内容有CPU利用率飙高定位步骤、CPU飙高的原因与解决;内存飙高定位步骤以及内存飙高故障分析及解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1244896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决:ImportError: cannot import name ‘Adam‘ from ‘keras.optimizers‘

解决:ImportError: cannot import name ‘Adam‘ from ‘keras.optimizers‘ 背景 在使用之前的代码时,报错: from keras.optimizers import Adam ImportError: cannot import name ‘Adam’ 报错问题 from keras.optimizers import Adam I…

【赠书第7期】从零基础到精通Flutter开发

文章目录 前言 1 安装Flutter和Dart 2 了解Flutter的基础概念 2.1 Widget 2.2 MaterialApp和Scaffold 2.3 Hot Reload 3 编写你的第一个Flutter应用 3.1 创建一个Flutter项目 3.2 修改默认页面 3.3 添加交互 4 深入学习Flutter高级特性 4.1 路由和导航 4.2 状态管…

「 系统设计 」 为什么要做架构分层?

「 系统设计 」 为什么要做架构分层? 参考&鸣谢 3.设计模式之分层思维:为什么要做代码分层架构? 从零开始学架构(八)分层架构和设计模式 架构模式之分层架构总结 文章目录 「 系统设计 」 为什么要做架构分层&…

【libGDX】使用Mesh绘制立方体

1 前言 本文主要介绍使用 Mesh 绘制立方体,读者如果对 Mesh 不太熟悉,请回顾以下内容: 使用Mesh绘制三角形使用Mesh绘制矩形使用Mesh绘制圆形 在绘制立方体的过程中,主要用到了 MVP (Model View Projection&#xff0…

<JavaEE> 什么是进程(Process)?进程管理,进程调度,内存管理,进程间通信和多进程编程

目录 一、进程(Process)的概念 二、进程管理 三、进程调度 四、内存管理 五、进程间通信 六、多进程编程 一、进程(Process)的概念 进程(process)也称为任务(task)&#xff0c…

sam和mobilesam的c#调用dll

这个主要注意: 我原本从一个地方把这个工程拷贝到另一个地方,然后我看了解决方案下的依赖项是有感叹号的,且这个时候代码出现很多下划的波浪红线。 然后我的做法如下: 然后我发现一直添加不了opencvsharp的dll文件,报…

Adiponectin 脂联素 ; T-cadherin +exosome

T-cadherin Adiponectin exosome T-cadherin Adiponectin exosome 代谢综合征中 外泌体、脂肪组织 和 脂联素 的器官间通讯-2019.pdf

基于IDEA+HTML+SpringBoot前后端分离电子商城

基于springboot的电子商城 项目介绍💁🏻 •B2C 商家对客户 •C2B2C 客户对商家对客户 1.1.1 B2C 平台运营方即商品的卖家 小米商城 •商品 •用户 1.1.2 C2B2C 平台运营方不卖商品(也可以卖) 卖家是平台的用户 买家也是平台用户 •…

HarmonyOS(五)—— 认识页面和自定义组件生命周期

前言 在前面我们通过如何创建自定义组件一文知道了如何如何自定义组件以及自定义组件的相关注意事项,接下来我们认识一下页面和自定义组件生命周期。 自定义组件和页面的关系 在开始之前,我们先明确自定义组件和页面的关系 自定义组件:Co…

基于C#实现线段树

一、线段树 线段树又称"区间树”,在每个节点上保存一个区间,当然区间的划分采用折半的思想,叶子节点只保存一个值,也叫单元节点,所以最终的构造就是一个平衡的二叉树,拥有 CURD 的 O(lgN)的时间。 从…

解决:javax.websocket.server.ServerContainer not available 报错问题

原因: 用于扫描带有 ServerEndpoint 的注解成为 websocket,该方法是 服务器端点出口,当进行 SpringBoot 单元测试时,并没有启动服务器,所以当加载到这个bean时会报错。 解决方法: 加上这个注解内容 Spr…

不做机器视觉工程师,转行,转岗的建议与想法

正所谓外行看热闹,内行看门道。提前咨询前辈们,多问问,多看看。要做就做,一定要提前做好防范。 无论你是要转行或者是转岗,看你有没有本钱和试错成本 有些人,家庭好,可以一直去试错和从头再来。…

MySQL 8 配置文件详解与最佳实践

MySQL 8 是一款强大的关系型数据库管理系统,通过适当的配置文件设置,可以充分发挥其性能潜力。在这篇博客中,我们将深入探究 MySQL 8 常用的配置文件,并提供一些建议,帮助您优化数据库性能。 配置文件概览 在 MySQL …

4.常见面试题--操作系统

特点:并发性、共享性、虚拟性、异步性。 Windows 和 Linux 内核差异 对于内核的架构⼀般有这三种类型: ● 宏内核,包含多个模块,整个内核像⼀个完整的程序; ● 微内核,有⼀个最⼩版本的内核&#xff0…

linux的基础命令

文章目录 linux的基础命令一、linux的目录结构(一)Linux路径的描述方式 二、Linux命令入门(一)Linux命令基础格式 三、ls命令(一)HOME目录和工作目录(二)ls命令的参数1.ls命令的-a选…

Java项目如何打包成Jar(最简单)

最简单的办法,使用Maven插件(idea自带) 1.选择需要打包的mudule,点击idea右侧的maven插件 2.clean操作 3.选择需要的其他mudule,进行install操作(如果有) 4.再次选择需要打包的module&#…

UDP客户端使用connect与UDP服务器使用send函数和recv函数收发数据

服务器代码编译运行 服务器udpconnectToServer.c的代码如下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #include<errno.h> #inclu…

什么是网络爬虫技术?它的重要用途有哪些?

网络爬虫&#xff08;Web Crawler&#xff09;是一种自动化的网页浏览程序&#xff0c;能够根据一定的规则和算法&#xff0c;从互联网上抓取和收集数据。网络爬虫技术是随着互联网的发展而逐渐成熟的一种技术&#xff0c;它在搜索引擎、数据挖掘、信息处理等领域发挥着越来越重…

CentOS Stream 9系统Cgroup问题处理

安装docker容器启动失败 之前适配过Ubuntu系统的容器&#xff0c;由于版本比较高&#xff0c;没有挂载Cgroup的路径。这次使用Centos Stream 9系统安装docker容器时也遇到了这个情况。由于处理方式有些不一样&#xff0c;所以记录一下。 这是docker容器启动过报错的输出日志。…

C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)

前言 我们在开发串口通信程序时,有时候会遇到比如单片机或者传感器发送的数据速度特别快,比如10ms、20ms发送一次,并且每次发送的数据量还比较大,如果按照常规的写法,我们会发现接收的数据还没处理完,新的数据又发送过来了,这就会导致处理数据滞后,软件始终处理的不是…