JAVA 内存使用过高排查方案

24,950 阅读2分钟

文章介绍了关于发现JVM内存过大问题时,的一些简单的排查方法,主要分为3个小方法:

  • 使用jmap -histo查询当前占用内存较大的类
  • dump出堆内存,文件过大时在服务器使用jhat 查看dump文件堆内存状态
  • dump出堆内存,下载堆文件到本地,通过VisualVM查看dump文件堆内存状态

一、如何发现内存问题

可以通过使用linux中的top命令查询服务器中占用内存的状态:

image.png

使用top命了后会出现下图内容,默认是CPU排序的服务器情况。我们可以调整为内存排序,整理不同的服务按键不一样。

image.png

  • Linux:直接在窗口点击“m”键,就使用内存排序,如下图:

image.png

二、找到高内存的类

使用jmap -histo查询当前占用内存较大的类 这里使用下面命令查看占用内存高的前20个类,这里就定位到问题类了,从下图中可以看到相应业务中占用内存比较高的类

image.png

jmap -histo <pid> | head -20

如果相应明显的看出 可以使用

jhat

dump出堆内存,文件过大时在服务器使用jhat 查看dump文件堆内存状态 在服务器中使用jmap命令dump出服务的堆信息

jmap -dump:format=b,file=文件名字.hporf <pid>
 命令中format=b为固定值,file为dump出来的文件名称,后缀使用hporf

image.png

当dump出来的文件非常大,不方便导出服务区进行分析,我们可以使用jhat 命令启动分析服务进行内存分析。

jhat 文件名.hporf(刚刚dump出来的文件)

image.png

执行晚命令后会出现如图的,显示分析服务已启动,端口为7000,我们使用浏览器访问ip:700(我是本地使用jhat,所以ip为localhost)

image.png

我们下拉到最下面,点击Show heap histogram链接

image.png

我们能看到堆占用类的降序排列,可以看出里面包含了一个10000对象的我们自建的MemoryBean类,这里就定位到问题类了

VisualVM

dump出堆内存,下载堆文件到本地,通过VisualVM查看dump文件堆内存状态

VisualVM查看dump文件堆大家可以具体学习下,具体见我下一片文章