天天看點

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

作者:JAVA後端架構
JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

前言

本文會從 Windows、Linux 兩個系統來做示例展示,有人會有疑問了:為什麼要說 Windows 版的 ? 目前市面上還是有很多 Windows 伺服器的,應用于傳統行業、政府結構、醫療行業 等等;兩個系統下的情況都示範下,有備無患。

文中用到了兩個工具:Processor Explorer、MAT,它們是什麼,有什麼用,怎麼用,本文不做介紹,不知道的小夥伴最好先去做下功課。

cpu 100%

下面的示例中, cpu 的占有率沒到 100%,隻是比較高,但是排查方式是一樣的,希望大家不要鑽牛角尖

Windows

1、找到 cpu 占有率最高的 java 程序号

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

PID: 20260

2、根據程序号找到 cpu 占有率最高的線程号

輕按兩下剛剛找到的 java 程序

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

線程号: 15900 ,轉成十六進制: 3e1c

3、利用 jstack 生成虛拟機中所有線程的快照

指令: jstack -l {pid} > {path}

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

檔案路徑: D:\20260.stack

4、線程快照分析

我們先浏覽下快照内容

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

内容還算比較簡潔,線程快照格式都是統一的,我們以一個線程快照簡單說明下

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查
"main" #1 prio=5 os_prio=0 tid=0x0000000002792800 nid=0x3e1c runnable [0x00000000025cf000] 

           

我們前面找到占 cpu 最高的線程号: 15900 ,十六進制: 3e1c ,用 3e1c 去快照檔案裡面搜一下

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

自此,找到問題

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

Linux

排查方式與 Windows 版一樣,隻是指令有些差別

1、找到 cpu 占有率最高的 java 程序号

使用指令: top -c 顯示運作中的程序清單資訊, shift + p 使清單按 cpu 使用率排序顯示

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

PID = 2227 的程序,cpu 使用率最高

2、根據程序号找到 cpu 占有率最高的線程号

使用指令: top -Hp {pid} ,同樣 shift + p 可按 cpu 使用率對線程清單進行排序

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

PID = 2228 的線程消耗 cpu 最高,十進制的 2228 轉成十六進制 8b4

3、利用 jstack 生成虛拟機中所有線程的快照

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

4、線程快照分析

分析方式與 Windows 版一緻,我們可以把 2227.stack 下載下傳到本地進行分析,也可直接在 Linux 上分析

在 Linux 上分析,指令: cat 2227.stack |grep ‘8b4’ -C 5

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

至此定位到問題

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

    

不管是在 Windows 下,還是在 Linux 下,排查套路都是一樣的

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

記憶體洩露

同樣的,Windows、Linux 各展示一個示例

Windows

1、找到記憶體占有率最高的程序号 PID

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

      

第一眼看上去, idea 記憶體占有率最高,因為我是以 idea 啟動的 java 程序;idea 程序我們無需關注,我們找到記憶體占有率最高的 java 的 PID: 10824

2、利用 jmap 生成堆轉儲快照

指令: jmap -dump:format=b,file={path} {pid}

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

dump 檔案路徑: D:\heapdump_108244.hprof

3、利用 MAT 分析 dump 檔案

MAT:Memory Analyzer Tool,是針對 java 的記憶體分析工具;下載下傳位址:

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

選擇對應的版本,下載下傳後直接解壓;預設情況下,mat 最大記憶體是 1024m ,而我們的 dump 檔案往往大于 1024m,是以我們需要調整,在 mat 的 home 目錄下找到 MemoryAnalyzer.ini ,将 -Xmx1024m 修改成大于 dump 大小的空間, 我把它改成了 -Xmx4096m

接着我們就可以将 dump 檔案導入 mat 中,開始 dump 檔案的解析

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

解析是個比較漫長的過程,我們需要耐心等待

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

解析完成後,我們可以看到如下概況界面

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

各個視窗的各個細節就不做詳細介紹了,有興趣的可自行去查閱資料;我們來看看幾個圖:餅狀圖、直方圖、支配樹、可疑的記憶體洩露報告

餅狀圖

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

        

可以看出, com.lee.schedule.Schedule 對象持有 1G 記憶體,肯定有問題

直方圖

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

我們看下 Person 定義

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Person {

    private String name;
    private Integer age;

}

           

可想而知,上圖示記的幾項都與 Person 有關

支配樹

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

        這就非常直覺了,Schedule 中的 ArrayList 占了 99.04% 的大小

可疑的記憶體洩露報告

通過這些資料,相信大家也能找到問題所在了

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

## Linux

    排查方式與 Windows 一樣,隻是有稍許的指令差別

1、找到記憶體占有率最高的程序号

使用指令: top -c 顯示運作中的程序清單資訊, shift + m 按記憶體使用率進行排序

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

程序号: 2527

2、利用 jmap 生成堆轉儲快照

指令: jmap -dump:format=b,file={path} {pid}

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

堆轉儲快照檔案路徑: /opt/heapdump_2527.hprof

3、利用 MAT 分析堆轉儲快照

将 heapdump_2448.phrof 下載下傳到本地,利用 MAT 進行分析;分析過程與 Windows 版完全一緻

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

      自此,定位到問題

Windows 下與 Linux 下,排查流程是一樣的

    

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

總結

JVM 常用指令

  • jps:列出正在運作的虛拟機程序
  • jstat:監視虛拟機各種運作狀态資訊,可以顯示虛拟機程序中的類裝載、記憶體、垃圾收集、JIT編譯等運作資料
  • jinfo:實時檢視和調整虛拟機各項參數
  • jmap:生成堆轉儲快照,也可以查詢 finalize 執行隊列、Java 堆和永久代的詳細資訊
  • jstack:生成虛拟機目前時刻的線程快照
  • jhat:虛拟機堆轉儲快照分析工具:與 jmap 搭配使用,分析 jmap 生成的堆轉儲快照,與 MAT 的作用類似

排查步驟

1、先找到對應的程序: PID

2、生成線程快照 stack (或堆轉儲快照: hprof )

3、分析快照(或堆轉儲快照),定位問題

記憶體洩露、記憶體溢出和 CPU 100% 關系

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

常用 JVM 性能檢測工具

Eclipse Memory Analyer、JProfile、JProbe Profiler、JVisualVM、JConsole、Plumbr

為幫助開發者們提升面試技能、有機會入職BATJ等大廠公司,特别制作了這個專輯——這一次整體放出。

大緻内容包括了: Java 集合、JVM、多線程、并發程式設計、設計模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大廠面試題等、等技術棧!

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

歡迎大家關注公衆号【Java爛豬皮】,回複【666】,擷取以上最新Java後端架構VIP學習資料以及視訊學習教程,然後一起學習,一文在手,面試我有。

每一個專欄都是大家非常關心,和非常有價值的話題,如果我的文章對你有所幫助,還請幫忙點贊、好評、轉發一下,你的支援會激勵我輸出更高品質的文章,非常感謝!

JVM 常見線上問題:CPU100%、記憶體洩露的問題排查

繼續閱讀