小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java進階必備:利用 JVM 命令(jstack、jmap)排查 CPU 100%、內(nèi)存泄露 問題

 昵稱10087950 2022-06-16 發(fā)布于江蘇
作者:青石路
鏈接:https://www.cnblogs.com/youzhibing/p/13599874.html

1開心一刻

圖片

明明是個小 bug,但就是死活修不好,我特么心態(tài)崩了......

2前言

后文會從 Windows、Linux 兩個系統(tǒng)來做示例展示,有人會有疑問了:為什么要說 Windows 版的 ?目前市面上還是有很多 Windows 服務器的,應用于傳統(tǒng)行業(yè)、政府結構、醫(yī)療行業(yè) 等等;兩個系統(tǒng)下的情況都演示下,有備無患

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

3cpu 100%

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

Windows

1、找到 cpu 占有率最高的 java 進程號

圖片

PID:20260

2、根據(jù)進程號找到 cpu 占有率最高的線程號

雙擊剛剛找到的 java 進程:

圖片

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

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

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

圖片

文件路徑:D:\20260.stack

4、線程快照分析

我們先瀏覽下快照內(nèi)容:

圖片

內(nèi)容還算比較簡潔,線程快照格式都是統(tǒng)一的,我們以一個線程快照簡單說明下:

"main" #1 prio=5 os_prio=0 tid=0x0000000002792800 nid=0x3e1c runnable [0x00000000025cf000]

圖片

我們前面找到占 cpu 最高的線程號:15900 ,十六進制:3e1c ,用 3e1c  去快照文件里面搜一下:

圖片

自此,找到問題。

圖片

Linux

排查方式與 Windows 版一樣,只是命令有些區(qū)別。

歡迎關注公眾號"Java學習之道",查看更多干貨!

1、找到 cpu 占有率最高的 java 進程號

使用命令:top -c 顯示運行中的進程列表信息, shift + p 使列表按 cpu 使用率排序顯示:

圖片

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

2、根據(jù)進程號找到 cpu 占有率最高的線程號

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

圖片

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

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

圖片

4、線程快照分析

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

在 Linux 上分析,命令:cat 2227.stack |grep '8b4' -C 5

圖片

至此定位到問題。

圖片

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

圖片

4內(nèi)存泄露

同樣的,Windows、Linux 各展示一個示例。歡迎關注公眾號"Java學習之道",查看更多干貨!

Windows

1、找到內(nèi)存占有率最高的進程號 PID

圖片

第一眼看上去, idea 內(nèi)存占有率最高,因為我是以 idea 啟動的 java 進程;idea 進程我們無需關注,我們找到內(nèi)存占有率最高的 java 的 PID:10824

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

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

圖片

dump 文件路徑:D:\heapdump_108244.hprof

3、利用 MAT 分析 dump 文件

MAT:Memory Analyzer Tool,是針對 java 的內(nèi)存分析工具;下載地址:

圖片

選擇對應的版本,下載后直接解壓;默認情況下,mat 最大內(nèi)存是 1024m ,而我們的 dump 文件往往大于 1024m,所以我們需要調(diào)整,在 mat 的 home 目錄下找到 MemoryAnalyzer.ini ,將 Xmx1024m 修改成大于 dump 大小的空間, 我把它改成了 Xmx4096m

接著我們就可以將 dump 文件導入 mat 中,開始 dump 文件的解析:

圖片

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

圖片

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

圖片

各個窗口的各個細節(jié)就不做詳細介紹了,有興趣的可自行去查閱資料;我們來看看幾個圖:餅狀圖、直方圖、支配樹、可疑的內(nèi)存泄露報告。

餅狀圖:

圖片

可以看出, com.lee.schedule.Schedule 對象持有 1G 內(nèi)存,肯定有問題。

直方圖:

圖片

我們看下 Person 定義:

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String name;
    private Integer age;
}

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

支配樹:

圖片

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

可疑的內(nèi)存泄露報告:

圖片

通過這些數(shù)據(jù),相信大家也能找到問題所在了。

圖片

Linux

排查方式與 Windows 一樣,只是有稍許的命令區(qū)別

1、找到內(nèi)存占有率最高的進程號

使用命令:top -c 顯示運行中的進程列表信息, shift + m 按內(nèi)存使用率進行排序

圖片

進程號:2527

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

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

圖片

堆轉儲快照文件路徑:/opt/heapdump_2527.hprof

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

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

圖片

自此,定位到問題。

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

圖片

5總結

JVM 常用命令

  • jps:列出正在運行的虛擬機進程
  • jstat:監(jiān)視虛擬機各種運行狀態(tài)信息,可以顯示虛擬機進程中的類裝載、內(nèi)存、垃圾收集、JIT編譯等運行數(shù)據(jù)
  • jinfo:實時查看和調(diào)整虛擬機各項參數(shù)
  • jmap:生成堆轉儲快照,也可以查詢 finalize 執(zhí)行隊列、Java 堆和永久代的詳細信息
  • jstack:生成虛擬機當前時刻的線程快照
  • jhat:虛擬機堆轉儲快照分析工具:與 jmap 搭配使用,分析 jmap 生成的堆轉儲快照,與 MAT 的作用類似

排查步驟

  • 1、先找到對應的進程:PID
  • 2、生成線程快照 stack (或堆轉儲快照:hprof
  • 3、分析快照(或堆轉儲快照),定位問題

內(nèi)存泄露、內(nèi)存溢出和 CPU 100% 關系

圖片

常用 JVM 性能檢測工具

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

6參考

  • 一次完整的JVM堆外內(nèi)存泄漏故障排查記錄
  • 【原創(chuàng)】談談線上CPU100%排查套路
  • 緊急修復一次線上商城系統(tǒng)高并發(fā)優(yōu)化實戰(zhàn)
  • 面試官:如果你們的系統(tǒng) CPU 突然飆升且 GC 頻繁,如何排查?
  • 記一次公司JVM堆溢出抽絲剝繭定位的過程
  • MAT:一次線上內(nèi)存泄漏排查
  • JVM探秘:MAT分析內(nèi)存溢出

-End-

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多