您好,登錄后才能下訂單哦!
本篇內容主要講解“如何實現內存泄露、內存溢出和 CPU100%”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何實現內存泄露、內存溢出和 CPU100%”吧!
下面的示例中, cpu 的占有率沒到 100%,只是比較高,但是排查方式是一樣的,希望大家不要鉆牛角尖
Windows
1、找到 cpu 占有率最高的 java 進程號
PID: 20260
2、根據進程號找到 cpu 占有率最高的線程號
雙擊剛剛找到的 java 進程
線程號: 15900 ,轉成十六進制: 3e1c
3、利用 jstack 生成虛擬機中所有線程的快照
命令: jstack -l {pid} > {path}
文件路徑: D:\20260.stack
4、線程快照分析
我們先瀏覽下快照內容
內容還算比較簡潔,線程快照格式都是統一的,我們以一個線程快照簡單說明下
"main" #1 prio=5 os_prio=0 tid=0x0000000002792800 nid=0x3e1c runnable 0x00000000025cf000
我們前面找到占 cpu 最高的線程號: 15900 ,十六進制: 3e1c ,用 3e1c 去快照文件里面搜一下
自此,找到問題
Linux
排查方式與 Windows 版一樣,只是命令有些區別
1、找到 cpu 占有率最高的 java 進程號
使用命令: top -c 顯示運行中的進程列表信息, shift + p 使列表按 cpu 使用率排序顯示
PID = 2227 的進程,cpu 使用率最高
2、根據進程號找到 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 下,排查套路都是一樣的
同樣的,Windows、Linux 各展示一個示例
Windows
1、找到內存占有率最高的進程號 PID
第一眼看上去, idea 內存占有率最高,因為我是以 idea 啟動的 java 進程;idea 進程我們無需關注,我們找到內存占有率最高的 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 的內存分析工具;下載地址:
選擇對應的版本,下載后直接解壓;默認情況下,mat 最大內存是 1024m ,而我們的 dump 文件往往大于 1024m,所以我們需要調整,在 mat 的 home 目錄下找到 MemoryAnalyzer.ini ,將 -Xmx1024m 修改成大于 dump 大小的空間, 我把它改成了 -Xmx4096m
接著我們就可以將 dump 文件導入 mat 中,開始 dump 文件的解析
解析是個比較漫長的過程,我們需要耐心等待
解析完成后,我們可以看到如下概況界面
各個窗口的各個細節就不做詳細介紹了,有興趣的可自行去查閱資料;我們來看看幾個圖:餅狀圖、直方圖、支配樹、可疑的內存泄露報告
餅狀圖
可以看出, com.lee.schedule.Schedule 對象持有 1G 內存,肯定有問題
直方圖
我們看下 Person 定義
可想而知,上圖標記的幾項都與 Person 有關
支配樹
這就非常直觀了,Schedule 中的 ArrayList 占了 99.04% 的大小
可疑的內存泄露報告
通過這些數據,相信大家也能找到問題所在了
Linux
排查方式與 Windows 一樣,只是有稍許的命令區別
1、找到內存占有率最高的進程號
使用命令: top -c 顯示運行中的進程列表信息, shift + m 按內存使用率進行排序
進程號: 2527
2、利用 jmap 生成堆轉儲快照
命令: jmap -dump:format=b,file={path} {pid}
堆轉儲快照文件路徑: /opt/heapdump_2527.hprof
3、利用 MAT 分析堆轉儲快照
將 heapdump_2448.phrof 下載到本地,利用 MAT 進行分析;分析過程與 Windows 版完全一致
自此,定位到問題
Windows下 與 Linux 下,排查流程是一樣的
jps:列出正在運行的虛擬機進程
jstat:監視虛擬機各種運行狀態信息,可以顯示虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據
jinfo:實時查看和調整虛擬機各項參數
jmap:生成堆轉儲快照,也可以查詢 finalize 執行隊列、Java 堆和永久代的詳細信息
jstack:生成虛擬機當前時刻的線程快照
jhat:虛擬機堆轉儲快照分析工具
與 jmap 搭配使用,分析 jmap 生成的堆轉儲快照,與 MAT 的作用類似
1、先找到對應的進程: PID
2、生成線程快照 stack (或堆轉儲快照: hprof )
3、分析快照(或堆轉儲快照),定位問題
到此,相信大家對“如何實現內存泄露、內存溢出和 CPU100%”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。