记一次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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章