JVM學習日記(十四)Day14——性能監控與調優(一)

經過前幾篇的鋪墊,現在開始正式進入調優篇,也是大火實際用的到的和感興趣的,但是前期的知識積累還是有必要的,所以還對JVM基礎沒什么了解的,建議還是回看主包的前幾篇內容,當然看其他優秀的博主也是可以的。

性能調優三步驟?

  1. 發現問題——性能監控:我們通過GUI圖形工具或者JVM命令后對程序進行監控,如出現FullGC頻率過高、CPU負載較高、死鎖、OOM內存泄漏/溢出,或者更加簡單的就是程序莫名其妙響應時間過長大白話就是卡頓。
  2. 排查問題——性能分析:通過對內存的分析、查看GC日志、查看JVM狀態、已經堆棧信息來確定大概的調優方向,分析出那個區域需要調整。
  3. 解決問題——性能調優:經過監控和分析已經知道了問題的大致方向,然后進行處理,比如增加內存的大小、使用消息隊列緩存、增加機器也就是分布式減輕壓力、優化代碼控制內存的使用。

?這個圖來自于尚硅谷的宋紅康老師的課程,主包也是跟著宋老師學習整理的資料,想學習的更加細節和系統化可以去某站搜索。

jps:列出當前用戶的所有Java進程

jps -lvm 
//-q:只顯示進程ID
//-l:顯示完整包名
//-v:顯示JVM參數
//-m:顯示main方法的參數jps -l
22417 jdk.jcmd/sun.tools.jps.Jps  //jps也是個java進程
22260 org.jetbrains.jps.cmdline.Launcher //idea編譯進程
2422                                     //僵尸或者特殊進程不用理會
32988 com.example.seed.SeedApplication//項目進程
89423 com.intellij.idea.Main //idea主進程

這里說一下,其實我們使用的命令全部是在JDK的bin目錄下,主包這個是Mac文件的類型顯示的就是Unix可執行的文件,要是Window就應該是.exe的文件,有興趣的小伙伴可以自己去查看一下。?另外這個腳步使用的文件就在/home/lib/tools.jar中,在jar包的/sun/tools目錄下,也是一個字節碼文件,又興趣的小伙伴可以自己去查看,這邊就不演示了。(如果使用了-XX:-UserPerfData那么jps和jstat都無法探查這個進程,因為關閉了用戶性能數據)

jstat?- JVM統計監控工具

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
--<option>//操作參數(必填)
--[-t]    //JVM啟動到現在的時間
[-h<lines>]//每幾行重新打印表頭
--<vmid>  //Java進程Pid
[<interval>//每次打印的間隔時間1000=1秒
[<count>]]//打印次數
選項說明
-class類加載統計
-compilerJIT編譯器統計
-gcGC統計
-gccapacity各內存區域容量統計
-gcutilGC統計百分比
-gccauseGC統計及原因(同-gcutil,但包含最近一次GC原因)
-gcnew新生代GC統計
-gcnewcapacity新生代內存容量統計
-gcold老年代GC統計
-gcoldcapacity老年代內存容量統計
-gcmetacapacity元空間內存容量統計
-printcompilationJVM編譯方法統計

?圖太小的話就放大來看吧,這里就是完整的命令格式,當然必須要大就是操作和PID參數其他的看各自的需求了,這個命令也是查看JVM最多的命令,可以查的消息還是很全面的。

列名說明示例值
TimestampJVM 啟動后的時間戳(秒)134663.6
S0CSurvivor 0 區容量(KB)0.0
S1CSurvivor 1 區容量(KB)6144.0
S0USurvivor 0 區已使用(KB)0.0
S1USurvivor 1 區已使用(KB)6144.0
ECEden 區容量(KB)51200.0
EUEden 區已使用(KB)32768.0
OC老年代容量(KB)40960.0
OU老年代已使用(KB)32549.8
MCMetaspace 容量(KB)54528.0
MUMetaspace 已使用(KB)53845.6
CCSC壓縮類空間容量(KB)7488.0
CCSU壓縮類空間已使用(KB)7206.5
YGC年輕代 GC 次數10
YGCT年輕代 GC 總時間(秒)0.126
FGCFull GC 次數0
FGCTFull GC 總時間(秒)0.000
CGCConcurrent GC 次數4
CGCTConcurrent GC 總時間(秒)0.002
GCT所有 GC 總時間(秒)0.128

這個呢就是各個打印代表的意思了。其他的操作主包我就不演示了。其實使用這個命令就可以判斷內存是否有益處的風險,比如我們采用抽樣調查的方法,相同的時間間隔下去對老年區進行監控,如果老年區內存占用在某一個時間段激增或者每段時間都增加的比較多,可能就是內存泄漏無法回收了。因為一般情況下除了靜態文件和Spring容器、數據庫連接池、監聽器等不會被回收,其他的基本上這個請求已結束等到下一個E去GC就會被回收的,如果一直沒有被回收肯定就是內存泄漏了。

jinfo?:查看和修改正在運行的 Java 進程的配置參數

jinfo [option] <pid>
參數選項作用
-flags顯示所有 JVM 參數(包括默認參數)
-sysprops顯示所有系統屬性(相當于 System.getProperties())
-flag <name>顯示指定 JVM 參數的值
-flag [+/-]<name>啟用或禁用指定的布爾型 JVM 參數
-flag <name>=<value>設置指定的 JVM 參數值
無參數同時顯示系統屬性和 JVM 參數
//查看最大的堆空間值jinfo -flag MaxHeapSize  32988     
-XX:MaxHeapSize=4294967296-flag [+/-]<name> - 修改布爾型參數
# 啟用PrintGCDetails
jinfo -flag +PrintGCDetails 12345-flag <name>=<value> - 修改數值型參數
# 修改MaxHeapFreeRatio
jinfo -flag MaxHeapFreeRatio=70 12345

好了主包這里只示范簡單的幾個命令,主包個人其實這個命令只有兩個操作,一個是flags一個就是flag,也很好記憶了,而且用處也是非常大的,就比如這個動態修改JVM參數了。不加任何參數查看的信息就非常的全了,大火快去自行嘗試一下。另外不是所有的JVM參數都能被修改的,這也是人之常情了,只有被manageable標記的參數。java -XX:+PrintFlagsFinal | grep manageable這個命令可以查看,大概能改的參數就是這些了,主包這個是JDK21可能和大家的不一樣,大家還是自己看看吧。

?jmap?:用于生成Java堆轉儲快照(heap dump)和分析堆內存使用情況

這個命令的作用主要就是生成dump的二進制文件,然后進行內存分析的,當然需要借助工作不然我們可是看不懂二進制文件的,然后就是查詢類加載器信息?、?查看finalizer隊列??、分析對象內存分布?(用的多多主包已經飆紅了)。

jmap [options] <pid>               # 連接運行中的Java進程
jmap [options] <executable> <core>  # 連接核心轉儲文件
jmap [options] [server_id@]<remote server IP or hostname>  # 連接遠程調試服務器
參數功能描述適用場景
-dump生成堆轉儲文件(Heap Dump)內存泄漏分析、OOM 問題診斷
-heap顯示堆內存配置和使用摘要快速查看堆內存分配情況
-histo顯示堆中對象統計直方圖分析對象內存占用
-clstats顯示類加載器統計信息類加載問題診斷
-finalizerinfo顯示等待 finalize 的對象對象回收問題診斷
-F強制模式(當進程掛起時使用)JVM 無響應時的強制轉儲
#活著的對象
jmap -dump:[live,]format=b,file=<filename> <pid>
#全部的對象包括死的
jmap -dump:format=b,file=<filename> <pid>
//例如
jmap -dump:live,format=b,file=./Downloads/testH.hprof 32988
關鍵詞作用是否可選示例值
-dump主命令,表示要執行堆轉儲操作必選-
live只轉儲存活對象(會觸發Full GC)可選包含或不包含
format=b指定輸出格式為二進制必選必須為b
file=<filename>指定輸出文件路徑必選heap.hprof
<pid>目標Java進程ID必選1234

在我們分析的時候大多數選擇的都是存活的對象,因為?一般沒有被回收的對象就是存活的而且要死全部都看的話一個是這個文件回很大,另一個就是分析起來不是那么好分析需要的時間也就是更長了,此外還有一個辦法可以獲得dump文件,那就是JVM參數,因為大多少程序出現OOM崩潰的時候開發人員是不能第一時間獲得這個文件的,來不及和不可預測所有我們需要使用JVM參數來獲取崩潰時的內存快照。

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/to/dump/file.hprof

這倆參數相信大家也能看明白我就不介紹了。下面就是-heap和-histo的運行實例了,其他的就不演示了。

#查看堆內存信息
jmap -heap <pid>
Attaching to process ID 12345, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11using thread-local object allocation.
Parallel GC with 4 thread(s)  # 使用的GC類型Heap Configuration:           # 堆配置參數MinHeapFreeRatio         = 40MaxHeapFreeRatio         = 70MaxHeapSize              = 2147483648 (2048.0MB)  # 最大堆NewSize                  = 715653120 (682.5MB)    # 新生代大小MaxNewSize               = 715653120 (682.5MB)OldSize                  = 1431830528 (1365.5MB)  # 老年代大小NewRatio                 = 2                      # 新生代/老年代比例SurvivorRatio           = 8                      # Eden/Survivor比例MetaspaceSize           = 21807104 (20.796875MB) # 元空間CompressedClassSpaceSize = 1073741824 (1024.0MB)G1HeapRegionSize        = 0 (0.0MB)Heap Usage:                  # 堆使用情況
PS Young Generation          # 并行年輕代
Eden Space:                  # Eden區capacity = 537919488 (513.0MB)used     = 536870912 (512.0MB)free     = 1048576 (1.0MB)99.8% used
From Space:                  # Survivor From區capacity = 89128960 (85.0MB)used     = 0 (0.0MB)free     = 89128960 (85.0MB)0.0% used
To Space:                    # Survivor To區capacity = 89128960 (85.0MB)used     = 0 (0.0MB)free     = 89128960 (85.0MB)0.0% used
PS Old Generation            # 并行老年代capacity = 1431830528 (1365.5MB)used     = 536870912 (512.0MB)free     = 894959616 (853.5MB)37.5% used# 其他信息...
jmap -histo[:live] <pid> [> 輸出文件]
# 統計所有對象(包含未被回收的對象)前20個
jmap -histo 12345 | head -20jmap -histo:live 32988 | head -20num     #instances實例數量  #bytes字節大小  class name (module)
-------------------------------------------------------1:         81074       12879208  [B (java.base@21.0.5)2:         73927        1774248  java.lang.String (java.base@21.0.5)3:         18267        1607496  java.lang.reflect.Method (java.base@21.0.5)4:         48478        1551296  java.util.concurrent.ConcurrentHashMap$Node (java.base@21.0.5)5:         13055        1546952  java.lang.Class (java.base@21.0.5)6:          7083        1236824  [I (java.base@21.0.5)7:         13298         842456  [Ljava.lang.Object; (java.base@21.0.5)8:          6582         485232  [Ljava.util.HashMap$Node; (java.base@21.0.5)9:         12046         481840  java.util.LinkedHashMap$Entry (java.base@21.0.5)10:          7367         471488  java.util.LinkedHashMap (java.base@21.0.5)11:           393         452112  [Ljava.util.concurrent.ConcurrentHashMap$Node; (java.base@21.0.5)12:         11288         361216  java.util.HashMap$Node (java.base@21.0.5)13:         18351         293616  java.lang.Object (java.base@21.0.5)14:         10053         260904  [Ljava.lang.Class; (java.base@21.0.5)15:          4872         233856  java.lang.invoke.MemberName (java.base@21.0.5)16:          8861         212664  org.springframework.core.MethodClassKey17:          2970         166320  org.springframework.core.ResolvableType18:           353         158216  [Ljdk.internal.vm.FillerElement; (java.base@21.0.5)

總結

本篇主要講了進行性能調優要做的那些步驟,以及jps、jstat、jinfo、jamp的命令介紹,請大家一定要多多嘗試,光看肯定是記不住的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917405.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917405.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917405.shtml

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

相關文章

使用 Elasticsearch 和 AI 構建智能重復項檢測

作者&#xff1a;來自 Elastic Dayananda Srinivas 探索組織如何利用 Elasticsearch 檢測和處理貸款或保險申請中的重復項。 Elasticsearch 帶來了大量新功能&#xff0c;幫助你為你的使用場景構建最佳搜索方案。深入了解我們的示例 notebooks&#xff0c;開始免費云試用&#…

如何在不依賴 Office 的情況下轉換 PDF 為可編輯文檔

在日常工作里&#xff0c;我們經常需要處理各種文件格式的轉換問題&#xff0c;像Word轉PDF或者PDF轉Excel這樣的需求屢見不鮮。它是一款功能全面的PDF轉換工具&#xff0c;能夠幫助你輕松應對多種文檔處理任務。不僅能夠實現PDF與其他格式之間的轉換&#xff0c;如Word、Excel…

嵌入式學習筆記-MCU階段--DAY09

1. oled屏幕的接口IIC應用場合&#xff1a;2.IIC通信原理概念&#xff1a;IIC&#xff08;Inter-Integrated Circuit&#xff09;其實是IICBus簡稱&#xff0c;所以中文應該叫集成電路總線&#xff0c;它是一種串行通信總線&#xff0c;使用多主從架構&#xff0c;由飛利浦公司…

解決 Node.js 托管 React 靜態資源的跨域問題

在 Node.js 項目中托管 React 打包后的靜態資源時&#xff0c;可能會遇到跨域問題&#xff08;CORS&#xff09;。以下是幾種解決方案&#xff1a; 1. 使用 Express 中間件設置 CORS 頭 const express require(express); const path require(path); const app express();// …

【Linux】多路轉接之epoll

優化poll進行拷貝的開銷poll開銷過大將整個 pollfd 數組拷貝到內核態&#xff0c;以便內核檢查 fd 是否就緒&#xff08;從用戶態 → 內核態&#xff09;。內核檢查 fd 狀態&#xff0c;并填充 revents。將 pollfd 數組從內核態拷貝回用戶態&#xff0c;讓應用程序可以讀取 rev…

下載一個JeecgBoot-master項目 導入idea需要什么操作啟動項目

官網&#xff1a;開發環境搭建 | JEECG 文檔中心 一般做開發的電腦里都是有的&#xff0c;沒有的只能下載了 前端安裝 node官網:https://nodejs.org/zh-cnpnpm安裝:通過命令 后端安裝: jdk17 :https://www.oracle.com/cn/java/technologies/downloads/#java17maven :https://m…

解決 InputStream 只能讀取一次問題

是的&#xff0c;InputStream 的一個重要特性是它通常只能被讀取一次。這是因為&#xff1a;輸入流通常是單向的、順序訪問的數據源很多流&#xff08;如網絡流、文件流&#xff09;讀取后指針就移動了&#xff0c;無法回退有些流&#xff08;如Socket流&#xff09;甚至讀取后…

數據分析面試題

技都測試 1、請列舉5個 Excel 中常用的函數及寫法。[ if ] IF(A1>60, "及格", "不及格") —— 若 A1 單元格數值≥60&#xff0c;返回 “及格”&#xff0c;否則返回 “不及格”。IF(B2>100, B2*0.8, B2) —— 若 B2 數值 > 100&#xff0c…

【07】VisionMaster入門到精通——Blob分折

文章目錄0 視屏講解與演示1 案例演示2 參數詳解1 運行參數0 視屏講解與演示 1 案例演示 周長使能查找U型槽 短軸使能查找U型槽 面積篩選區域 當條件不符合是&#xff0c;該模塊顯示紅色&#xff0c;狀態為NG 顯示二值圖像 顯示Blob圖像 2 參數詳解 Blob分折&#xff0c;…

解釋 MySQL 中的 EXPLAIN 命令的作用和使用場景

解釋 MySQL 中的 EXPLAIN 命令的作用和使用場景 總結性回答 EXPLAIN 是 MySQL 中用于分析 SQL 查詢執行計劃的命令&#xff0c;它能展示 MySQL 如何執行一個查詢&#xff0c;包括使用的索引、表連接順序、掃描行數等關鍵信息。主要用于查詢性能優化&#xff0c;幫助開發者識別潛…

.env 文件

.env 文件其實就是一個純文本文件&#xff0c;用來寫“環境變量”鍵值對&#xff0c;格式非常簡單 &#x1f447;? .env 文件寫法格式&#xff1a;每一行就是一個變量名 值&#xff0c;不要加引號&#xff0c;不要加空格DEEPSEEK_API_KEYsk-xxxxxxxxxxxxxxxxxxxx完整例子&…

機器學習——K 折交叉驗證(K-Fold Cross Validation),案例:邏輯回歸 交叉尋找最佳懲罰因子C

什么是交叉驗證&#xff1f; 交叉驗證是一種將原始數據集劃分為若干個子集&#xff0c;反復訓練和驗證模型的策略。 交叉驗證&#xff08;Cross-Validation&#xff09;適用于你在模型調參&#xff08;如邏輯回歸中的 C&#xff09; 最常用的&#xff1a;K 折交叉驗證&#…

藍橋杯----串口

&#xff08;五&#xff09;、串口1、串口通信簡介制定通信的規則&#xff0c;通信雙方按照協議規則進行數據收發&#xff0c;將一個設備的數據傳送到另一個設備&#xff0c;擴展硬件系統&#xff0c;串口USART有兩根通信線Tx、Rx&#xff0c;可同時雙向通信&#xff0c;稱之為…

錯誤: 找不到或無法加載主類 原因: java.lang.ClassNotFoundException

背景&#xff1a; 代碼沒有更改&#xff0c;主類位置也沒有移動&#xff0c;運行時突然報找不到或無法加載主類的錯誤 錯誤: 找不到或無法加載主類 原因: java.lang.ClassNotFoundException編譯器上方顯示 Java file is located outside of the module source root so it wont …

Lock 接口及實現類詳解:從 ReentrantLock 到并發場景實踐

在 Java 并發編程中&#xff0c;除了synchronized關鍵字&#xff0c;java.util.concurrent.locks.Lock接口及其實現類是另一種重要的同步機制。自 JDK 5 引入以來&#xff0c;Lock接口憑借靈活的 API 設計、可中斷的鎖獲取、公平性控制等特性&#xff0c;成為復雜并發場景的首選…

「iOS」————SideTable

iOS學習前言sideTableSlideTablesSideTableBufSideTable前言 我們在上一篇中&#xff0c;簡單的介紹了weak的實現原理。其中弱引用表就是存儲在SideTable中的&#xff0c;這里我們來學習了解一下SideTable sideTable sideTable主要用于存儲和管理對象的額外信息&#xff0c;…

【PHP】CURL請求第三方API接口

當我們需要調用第三方接口時&#xff0c;就需要使用CURL&#xff0c;通過CURL操作去請求第三方API接口&#xff0c;有的是通過POST方式&#xff0c;有的是通過GET方式&#xff0c;下面介紹一個通用的使用CURL調用API接口的方法。一、CURL操作共兩個方法&#xff0c;分別是CURL操…

對于考研數學的理解

文章目錄高等數學總結補充說明1. 微分方程與無窮級數的特殊性2. 隱藏的邏輯鏈條3. 向量代數的橋梁作用核心框架為什么這樣設計&#xff1f;結論線性代數核心邏輯框架各講之間的本質聯系1. 行列式 → 矩陣2. 矩陣 → 向量組3. 矩陣 向量組 → 線性方程組4. 矩陣 → 特征值與特征…

基于 Hadoop 生態圈的數據倉庫實踐 —— OLAP 與數據可視化(四)

目錄 四、數據可視化與 Hue 簡介 1. 數據可視化簡介 &#xff08;1&#xff09;數據可視化的重要性 &#xff08;2&#xff09;數據可視化的用途 &#xff08;3&#xff09;實施數據可視化需要考慮的問題 &#xff08;4&#xff09;幾種主要的數據可視化工具 2. Hue 簡介…

HarmonyOS 開發:基于 ArkUI 實現復雜表單驗證的最佳實踐

摘要 在現代應用開發中&#xff0c;表單是最常見的交互方式之一。不管是用戶注冊、信息錄入&#xff0c;還是登錄驗證&#xff0c;表單的可靠性直接影響用戶體驗。而在鴻蒙 ArkUI 開發中&#xff0c;雖然表單結構清晰&#xff0c;但要實現 復雜驗證&#xff08;比如&#xff1a…