【性能優化】CPU利用率飆高與內存飆高問題

📫作者簡介:小明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.pswp.cn/news/165270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165270.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2023APMCM亞太杯數學建模選題建議及初步思路

大家好呀,亞太杯數學建模開始了,來說一下初步的選題建議吧: 首先定下主基調,本次亞太杯推薦選擇B題。 C題如果想做好,搜集數據難度并不低,并且模型比較簡單,此外目前選擇的人數過多&#xff0c…

java項目之消防物資存儲系統(ssm+vue)

項目簡介 消防物資存儲系統實現了以下功能: 管理員功能: 管理員登陸后,主要模塊包括首頁,個人中心,用戶管理,倉庫管理,物資入庫管理,物資出庫管理,倉庫管理,物資詳情管…

23年下半年軟考成績查詢時間是什么時候?

一、成績查詢時間 2023年下半年軟考成績查詢時間預計2023年12月份公布,成績查詢入口為計算機技術職業資格網(全國統一成績查詢時間,統一查詢入口)。 二、成績查詢方法 登陸中國計算機技術職業資格網,點擊“成績查詢”…

7-9 jmu-python-班級人員信息統計

7-9 jmu-python-班級人員信息統計 分數 15 作者 鄭如濱 單位 集美大學 輸入a,b班的名單,并進行如下統計。 輸入格式: 第1行::a班名單,一串字符串,每個字符代表一個學生,無空格,可能有重復字符。 第2行:&am…

WPF實戰項目十六(客戶端):備忘錄接口

1、新增IMemoService接口&#xff0c;繼承IBaseService接口 public interface IMemoService : IBaseService<MemoDto>{} 2、新增MemoService類&#xff0c;繼承BaseService和IMemoService接口 public class MemoService : BaseService<MemoDto>, IMemoService{pub…

DRF-通用分頁器(PageNumberPagination):ListModelMixin可以使用的通用分頁器

一、ListModelMixin 和GenericAPIView源碼 ListModelMixin 是一個單一功能類&#xff0c;必須配合GenericAPIView&#xff08;或其子類&#xff09;來一起使用&#xff0c;才能完成其視圖的功能 class ListModelMixin:"""List a queryset."""d…

騰訊云點播小程序端上傳 SDK

云點播是專門應對上傳大視頻文件的。 騰訊云點播文檔&#xff1a;https://cloud.tencent.com/document/product/266/18177 這個文檔比較簡單&#xff0c;實在不行&#xff0c;把demo下載下來&#xff0c;一看就明白了&#xff0c;然后再揉一下挪到自己的項目里。完事。 getSign…

芯知識 | 混音播報語音芯片的優勢:革新音頻應用的新力量

隨著科技的進步&#xff0c;語音芯片在各個領域的應用越來越廣泛。而在眾多語音芯片中&#xff0c;混音播報語音芯片以其獨特的優勢&#xff0c;正逐漸成為音頻應用領域的翹楚。本文將重點探討混音播報語音芯片的優勢及其在現代科技應用中的價值。 一、混音播報語音芯片概述 …

element-vue實現網頁鎖屏功能

1.寫一個鎖屏頁面&#xff0c;這里比較簡單&#xff0c;自己定義一下,需要放到底層HTML中哦&#xff0c;比如index.html <div id"appIndex"><el-dialog title"請輸入密碼解鎖屏幕" :visible.sync"lockScreenFlag" :close-on-click-mod…

力扣236. 二叉樹的最近公共祖先(java DFS解法)

Problem: 236. 二叉樹的最近公共祖先 文章目錄 題目描述思路解題方法復雜度Code 題目描述 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為&#xff1a;“對于有根樹 T 的兩個節點 p、q&#xff0c;最近公共祖先表示為一個節點 x&am…

Android逆向一-frida操作

系列文章目錄 第一章 frida操作 文章目錄 系列文章目錄前言一、兩種模式二、frida命令行執行及參數三、frida使用python執行四、動靜態域調用1. 靜態域調用2.動態域調用 五. 遠程rpc調用六. 補充總結 前言 熟悉frida操作&#xff0c;hook手機app的關鍵位置進行逆向操作 一、…

芯知識 | Flash可更換聲音語音芯片—引領音頻IC技術革新的新篇章

隨著科技的飛速發展&#xff0c;人們對于電子產品的音頻性能要求越來越高。在這種背景下&#xff0c;Flash可更換聲音語音芯片應運而生&#xff0c;成為音頻技術領域的一顆璀璨明星。本文將詳細介紹Flash可更換聲音語音芯片的特點、優勢以及應用場景&#xff0c;展望其在未來科…

【Docker】從零開始:10.registry搭建私有倉庫

【Docker】從零開始&#xff1a;10.registry搭建私有倉庫 為什么要使用私有倉庫關于Docker Registry基于容器搭建registry私有倉庫1.下載鏡像2. 啟動鏡像3.修改系統配置文件4.下載ubuntu鏡像&#xff0c;修改名稱3.提交鏡像4.查看鏡像 本地搭建私有倉庫(目前編譯報錯找不到包&a…

【管理運籌學】背誦手冊(五)| 動態規劃

五、動態規劃 基本概念 階段&#xff08;Stage&#xff09;&#xff1a;將所給問題的過程&#xff0c;按時間或空間特征分解成若干相互聯系的階段&#xff0c;以便按次序去求解每階段的解&#xff0c;常用字母 k k k 表示。 狀態&#xff08;State&#xff09;&#xff1a;…

java實現連接linux(上傳文件,執行shell命令等)

1 導入pom <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency> 2 編寫配置類 package com.budwk.app.atest;import com.budwk.app.common.config.AppExceptio…

計算機網絡之網絡層

一、概述 主要任務是實現網絡互連&#xff0c;進而實現數據包在各網絡之間的傳輸 1.1網絡引入的目的 從7層結構上看&#xff0c;網絡層下是數據鏈路層 從4層結構上看&#xff0c;網絡層下面是網絡接口層 至少我們看到的網絡層下面是以太網 以太網解決了什么問題&#xff1f; 答…

【Python 千題 —— 基礎篇】刪除列表值

題目描述 題目描述 刪除列表的指定值。有一個列表 [1, 3, 5, 2, 44, 1, 9, 10, 32] &#xff0c;請使用 for 循環刪除該列表中與 [44, 1, 9] 列表相同的值&#xff0c;并輸出該列表。 輸入描述 無輸入。 輸出描述 輸出操作后的列表。 示例 示例 ① 輸出&#xff1a; …

記錄:通過day.js獲取兩個日期相差的時間,并轉化為年月日的格式

day.js這個日期庫真的是很不錯的日期庫&#xff0c;足夠滿足日常的開發需求。 Day.js中文網 (fenxianglu.cn) 需求&#xff1a;獲取兩個日期相差的時間&#xff0c;轉化為年月日的形式&#xff1b;話不多少&#xff0c;直接放代碼 import dayjs from "dayjs"; imp…

計算機網絡之應用層

一、概述 引入目的&#xff1a; 為了方便用戶去使用&#xff1b; 該如何方便用戶使用網絡呢&#xff0c;即怎樣幫助用戶使用網絡&#xff1f; 1.用戶需要知道網絡資源所在的位置 2.網絡上資源一定是在資源子網的主機上 3.資源子網上的主機&#xff0c;在通信子網中用IP地…

qt-C++筆記之終端Ctrl+C關閉界面和ROS節點

qt-C筆記之終端CtrlC關閉界面和ROS節點 code review! 文章目錄 qt-C筆記之終端CtrlC關閉界面和ROS節點1.運行2.main.cpp3.main_window.hpp 1.運行 2.main.cpp 3.main_window.hpp