溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

發(fā)布時(shí)間:2021-10-11 17:30:09 來(lái)源:億速云 閱讀:187 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%”吧!

cpu 100%

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

Windows

1、找到 cpu 占有率最高的 java 進(jìn)程號(hào)

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

PID: 20260

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

雙擊剛剛找到的 java 進(jìn)程

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

線程號(hào): 15900 ,轉(zhuǎn)成十六進(jìn)制: 3e1c

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

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

文件路徑: D:\20260.stack

4、線程快照分析

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

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

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

自此,找到問(wèn)題

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

Linux

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

1、找到 cpu 占有率最高的 java 進(jìn)程號(hào)

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

PID = 2227 的進(jìn)程,cpu 使用率最高

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

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

PID = 2228 的線程消耗 cpu 最高,十進(jìn)制的 2228 轉(zhuǎn)成十六進(jìn)制 8b4

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

4、線程快照分析

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

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

至此定位到問(wèn)題

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

內(nèi)存泄露

同樣的,Windows、Linux 各展示一個(gè)示例

Windows

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

第一眼看上去, idea 內(nèi)存占有率最高,因?yàn)槲沂且?idea 啟動(dòng)的 java 進(jìn)程;idea 進(jìn)程我們無(wú)需關(guān)注,我們找到內(nèi)存占有率最高的 java 的 PID: 10824

2、利用 jmap 生成堆轉(zhuǎn)儲(chǔ)快照

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

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

3、利用 MAT 分析 dump 文件

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

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

接著我們就可以將 dump 文件導(dǎo)入 mat 中,開始 dump 文件的解析

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

解析是個(gè)比較漫長(zhǎng)的過(guò)程,我們需要耐心等待

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

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

餅狀圖

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

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

直方圖

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

我們看下 Person 定義

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

可想而知,上圖標(biāo)記的幾項(xiàng)都與 Person 有關(guān)

支配樹

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

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

可疑的內(nèi)存泄露報(bào)告

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

Linux

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

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

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

進(jìn)程號(hào): 2527

2、利用 jmap 生成堆轉(zhuǎn)儲(chǔ)快照

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

堆轉(zhuǎn)儲(chǔ)快照文件路徑: /opt/heapdump_2527.hprof

3、利用 MAT 分析堆轉(zhuǎn)儲(chǔ)快照

將 heapdump_2448.phrof 下載到本地,利用 MAT 進(jìn)行分析;分析過(guò)程與 Windows 版完全一致

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

自此,定位到問(wèn)題

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

總結(jié)

JVM 常用命令

jps:列出正在運(yùn)行的虛擬機(jī)進(jìn)程

jstat:監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息,可以顯示虛擬機(jī)進(jìn)程中的類裝載、內(nèi)存、垃圾收集、JIT編譯等運(yùn)行數(shù)據(jù)

jinfo:實(shí)時(shí)查看和調(diào)整虛擬機(jī)各項(xiàng)參數(shù)

jmap:生成堆轉(zhuǎn)儲(chǔ)快照,也可以查詢 finalize 執(zhí)行隊(duì)列、Java 堆和永久代的詳細(xì)信息

jstack:生成虛擬機(jī)當(dāng)前時(shí)刻的線程快照

jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具

與 jmap 搭配使用,分析 jmap 生成的堆轉(zhuǎn)儲(chǔ)快照,與 MAT 的作用類似

排查步驟

1、先找到對(duì)應(yīng)的進(jìn)程: PID

2、生成線程快照 stack (或堆轉(zhuǎn)儲(chǔ)快照: hprof )

3、分析快照(或堆轉(zhuǎn)儲(chǔ)快照),定位問(wèn)題

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

如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%

常用 JVM 性能檢測(cè)工具

到此,相信大家對(duì)“如何實(shí)現(xiàn)內(nèi)存泄露、內(nèi)存溢出和 CPU100%”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI