文章目录
- 前言
- 1 建议无脑的做一件事
- 2 jmp命令
- 3 导入 hprof 文件到Visual VM 中
- 4 查看对象属性值
前言
日常工作中,我们可能会遇到这样的场景:
- java项目发生了OOM;
- 想知道在某种场景下,堆里的信息,从而确认一些代码功能是否正常;
类似的情况也是时有发生的,这个时候,我们需要借助java的 jmap
命令去看看。
如果你想可视化的查看还得再加上一个插件 Visual VM。
我在这篇文章中,验证内存泄漏时,就使用了这个可视化工具,只能说相当好用:
https://blog.csdn.net/FBB360JAVA/article/details/128943206
插件有两种用法,如果你只是本地运行的话,建议直接在 IDEA 中安装插件,直接debug 运行就可以了。
本文重点是,如果项目是在Linux中跑着,你该怎么查看堆里的内容。
1 建议无脑的做一件事
建议在启动项目时,无脑的增加运行参数如下:
-XX:+HeapDumpOnOutOfMemoryError
这个命令的作用是,在发生 OOM 时,输出堆内信息。
这一点,在阿里巴巴的《码出高效:java开发手册》一书中的JVM篇章也有建议过。
这个命令,对于相隔数月才出现的OOM,或者偶发性的OOM,尤为重要。
另外,这个命令追加参数 HeapDumpPath
,可以把堆信息存到文件中,生成 hprof
类型的文件,而hprof
类型的文件,是可以导入到Visual VM中,可视化查看的。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=你的目录
2 jmp命令
首先我在本地启动一个SpringBoot项目,然后使用 jps
查看对应的应用端口。
随后使用 jmap
命令,将当前JVM堆内信息数据,导出为test.hprof
文件。
C:\Users\Administrator\Desktop>jps
3920 RemoteMavenServer
15716 Launcher
7016 CustomLogStarterTestApplication
8184
8280 Jps
1308
C:\Users\Administrator\Desktop>jmap -dump:format=b,file=test.hprof 7016
Heap dump file created
因为我是在桌面打开的cmd命令框,所以文件生成在了桌面:
可以看到这个文件还是挺大的。
3 导入 hprof 文件到Visual VM 中
首先我们打开 Visual VM。点击 File -> Load
然后选择文件类型为 *.hprof
,进而再选择你想导入的文件即可。
导入成功后的内容:
4 查看对象属性值
首先选择查看类的方式,选择了Packages
的方式。
然后在Class Filter中搜索,因为我的包名里有 feng
,所以按照这个搜,可以搜索到自己写的包和类。
然后就是想看哪个点哪个。
这里查看了CustomLogProperties
对象中的 enableCustomLog
的值,看到值是Boolean
类型,为 true
。