如何排查内存溢出问题


一、前言



二、如何识别

1.当前常见的内存溢出分类

  • java.lang.OutOfMemoryError:Java heap space
  • java.lang.OutOfMemoryError
  • java.lang.OutOfMemoryError:Metaspace

2.内存溢出已出现

  • tomcat,es 日志中能看到上面的报错信息。

3.内存溢出出现的路上

  • jstat是一种分析方法,通过他可以监控当前jvm的内存使用及gc信息,猜测是否存在内存溢出风险。

三、如何定位

1.内存溢出已出现

  • 尝试通过jmap命令抓一下内存
  • 成功抓出内存,用MenoryAnalyzer工具分析一下内存,定位内存溢出原因。
  • 没有成功抓出内存,重启服务,通过jstat命令观测,在内存溢出之前抓内存,然后用MenoryAnalyzer工具分析一下内存,定位内存溢出原因。

2.内存溢出出现的路上

  • 常用方法一:
  • jstat命令观测,在内存溢出之前抓内存,然后用MenoryAnalyzer工具分析一下内存,定位内存溢出原因。
  • 待验证方法二:
  • arthas,没有实战过内存溢出,可以研究一下。

四、如何解决

1.内存真不够用

  • 程序没有问题,根据业务需求,没有设置合理的内存。就需要增大内存来保证功能可用。

2.程序真有问题

  • 程序存在内存使用不合理,导致内存溢出,MenoryAnalyzer分析出来具体的问题,修复代码问题。

五、相关技能

  • jvm8内存模型
  • jstat命令
  • jmap命令
  • MenoryAnalyzer工具
  • arthas工具