記一次dump內存快照並分析對象數據的過程

前言:

    之前在產線環境有一個問題需要分析下,所以dump了下內存快照,並運用工具分析了下其中的某對象屬性信息。由於產線環境不能連接外網,所以無法截屏,也沒法將文章整理出來。

    所以筆者就選擇在本地把整個過程在本地環境再復現下,算是一個記錄。

 

準備工作:

    需要提前安裝好JDK;

    

1.根據應用啓動端口dump下其內存信息

    筆者最近在學習Sentinel,所以取近,就準備dump下sentinel-dashboard的內存信息。

    1)確認sentinel-dashboard的端口號

        這個是該應用啓動的時候確定的,爲8080

    2)根據端口號確認進程號

        Windows平臺下(筆者本地爲Windows平臺),在命令窗下輸入

netstat -ano | findstr 8080
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       536
  TCP    [::]:8080              [::]:0                 LISTENING       536

        可以看到對應進程號爲536

    3)根據jmap命令生成進程對應的dump信息

        D:\Program Files\Java\jdk1.8.0_131爲筆者JDK安裝路徑,jmap.exe就在%JAVA_HOME%/bin目錄下

D:\Program Files\Java\jdk1.8.0_131\bin> .\jmap.exe -dump:format=b,file=D:/testdump/dump.prof 536
Dumping heap to D:\testdump\dump.prof ...

        注意:這個testdump目錄是需要提前創建的,否則會報錯

 

2.分析dump信息

    1)生成可視文件

    當dump信息生成之後,我們可以根據jhat.exe(同樣也在%JAVA_HOME%/bin目錄下)命令來生成對應的在線可視文件。

    執行如下命令:

D:\Program Files\Java\jdk1.8.0_131\bin> .\jhat.exe  D:/testdump/dump.prof
Reading from D:/testdump/dump.prof...
Dump file created Tue Jan 14 11:11:36 GMT+08:00 2020
Snapshot read, resolving...
Resolving 890497 objects...
Chasing references, expect 178 dots..................................................................................................................................................................................
Eliminating duplicate references..................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

    2)訪問localhost:7000

    這裏面會展示當前內存快照中的所有對象信息。

 

    3)查詢對象信息

        針對我們想要查詢的對象,我們可以直接搜索該對象的類全限定名。

        比如:com.alibaba.csp.sentinel.dashboard.controller.AuthController,我們可以直接搜到結果值如下:

 

    以上這些信息都是對應的類信息,Instances中是其實例信息,筆者沒太搞明白這個Exclude 和Include有什麼區別,結果值都一樣。

    點一下Include subclasses

    發現當前類只有一個實例對象,點擊該實例,信息如下所示:

    可以看到這個實例的三個屬性值authPassword=sentinel,authUsername=sentinel。

    

通過以上方式,我們同樣可以對其他實例進行分析。

 

總結:

    dump內存信息並對實例信息進行分析,是我們分析具體問題的一個有力工具。

    上述查詢對象屬性信息的過程同樣可以使用OQL語法來查詢。

發佈了124 篇原創文章 · 獲贊 126 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章