點贊再看,養成習慣,微信搜索【三太子敖丙】關注這個互聯網苟且偷生的工具人。php
本文 GitHub github.com/JavaFamily 已收錄,有一線大廠面試完整考點、資料以及個人系列文章。java
上次給小夥伴們說過了死循環cpu飆高的排查過程,今天就帶着你們看看堆內存溢出咱們通常怎麼排查的。git
在排查以前,我想jvm的基礎知識你們應該都是瞭解了的吧?github
行行行,誒真實拿大家沒辦法,那我就帶你們回溫一下JVM的內存模型(這玩意跟JAVA內存模型JMM可不同,不要記錯了)web
今天我就直說堆,由於溢出是發送在堆中的。面試
JVM堆內存被分爲兩部分:年輕代(Young Generation)和老年代(Old Generation)。服務器
年輕代是全部新對象產生的地方。當年輕代內存空間被用完時,就會觸發垃圾回收。這個垃圾回收叫作Minor GC。微信
年輕代被分爲3個部分——Enden區和兩個Survivor區。eclipse
年老代內存裏包含了長期存活的對象和通過屢次Minor GC後依然存活下來的對象,一般會在老年代內存被佔滿時進行垃圾回收。jvm
老年代的垃圾收集叫作Major GC,Major GC一般是跟full GC是等價的,收集整個GC堆。
Full GC定義是相對明確的,就是針對整個新生代、老生代、元空間(metaspace,java8以上版本取代perm gen)的全局範圍的GC。
你們能夠從上圖看到年輕代分爲了一個Eden區和兩個survivor區(S1,S2),survivor區同一時間只會有一個滿一個空,交替的。
而後就是GC到必定的閾值到老年代,今天不講永久代因此忽略Mataspace。
今天我就用一個JDK自帶的工具jvisualvm來給你們演示一波怎麼操做的,由於這玩意誰都有,你去命令行敲一下jvisualvm就出來了(Mac是這樣的,不知道Windows是怎麼樣子的)。
超時,不進行服務,服務掛掉,接口不在服務這樣的異常問題。
那模擬也很簡單,我寫個循環一直往List丟數據,不使用list就能看到現象了
你們能夠看到圖形化界面仍是很清晰明瞭的,這個是Visual GC的插件
你們點擊菜單欄的插件,而後安裝就行了,安裝完了記得點擊激活。
能夠看到不釋放,堆空間就一直上去,直到OOM(out of memory)
這個時候咱們就dump下來堆信息看看
會dump出一個這樣的hprof快照文件,能夠用jvisualvm自己的系統去分析,我這裏推薦MAT吧,由於我習慣這個了。
MAT :下載地址
下來好了咱們能夠看到mat已經分析了咱們的文件
你看他就是個暖男,都幫咱們分析出來了一個問題,咱們點進去看看
他發現了是ArrayList的問題了,咱們再往下看看
看到了嘛,具體代碼的位置都幫咱們定位好了,那排查也就是手到擒來的事情了。
上面咱們使用工具jump了,那怎麼去服務器上jump呢?
jmap -dump:format=b,file=<dumpfile.hprof> <pid>
複製代碼
有朋友可能問了,不是全部的故障當時咱們都在場的,沒法及時jump,那也簡單
-XX:+HeapDumpOnOutOfMemoryError
複製代碼
配置這玩意以後,oom的時候會自動jump的,到時候拿快照分析一波就行了。
MAT的功能還有不少的,百度谷歌太多工具文了,我就不作重複的工做了,好比還能夠排查對象的強弱引用,還能夠查看引用鏈等等。
還有個只寫這麼點的緣由是有點晚了,頂不住了,最近不拍視頻也是由於事情多了,有點小忙,但願你們體量,對了Redis的分佈式鎖已經在安排的路上了。
我是敖丙,一個在互聯網苟且偷生的工具人。
最好的關係是互相成就,你們們的 「三連」 就是丙丙創做的最大動力,咱們下期見!
注:若是本篇博客有任何錯誤和建議,歡迎你們留言,你快說句話啊!
文章持續更新,能夠微信搜索「 三太子敖丙 」第一時間閱讀,回覆【資料】【面試】【簡歷】有我準備的一線大廠面試資料和簡歷模板,本文 GitHub github.com/JavaFamily 已經收錄,有大廠面試完整考點,歡迎Star。
你知道的越多,你不知道的越多