文章介绍了关于发现JVM内存过大问题时,的一些简单的排查方法,主要分为3个小方法:
- 使用jmap -histo查询当前占用内存较大的类
- dump出堆内存,文件过大时在服务器使用jhat 查看dump文件堆内存状态
- dump出堆内存,下载堆文件到本地,通过VisualVM查看dump文件堆内存状态
一、如何发现内存问题
可以通过使用linux中的top命令查询服务器中占用内存的状态:
使用top命了后会出现下图内容,默认是CPU排序的服务器情况。我们可以调整为内存排序,整理不同的服务按键不一样。
- Linux:直接在窗口点击“m”键,就使用内存排序,如下图:
二、找到高内存的类
使用jmap -histo查询当前占用内存较大的类 这里使用下面命令查看占用内存高的前20个类,这里就定位到问题类了,从下图中可以看到相应业务中占用内存比较高的类
jmap -histo <pid> | head -20
如果相应明显的看出 可以使用
jhat
dump出堆内存,文件过大时在服务器使用jhat 查看dump文件堆内存状态 在服务器中使用jmap命令dump出服务的堆信息
jmap -dump:format=b,file=文件名字.hporf <pid>
命令中format=b为固定值,file为dump出来的文件名称,后缀使用hporf
当dump出来的文件非常大,不方便导出服务区进行分析,我们可以使用jhat 命令启动分析服务进行内存分析。
jhat 文件名.hporf(刚刚dump出来的文件)
执行晚命令后会出现如图的,显示分析服务已启动,端口为7000,我们使用浏览器访问ip:700(我是本地使用jhat,所以ip为localhost)
我们下拉到最下面,点击Show heap histogram链接
我们能看到堆占用类的降序排列,可以看出里面包含了一个10000对象的我们自建的MemoryBean类,这里就定位到问题类了
VisualVM
dump出堆内存,下载堆文件到本地,通过VisualVM查看dump文件堆内存状态
VisualVM查看dump文件堆大家可以具体学习下,具体见我下一片文章