“在代码的世界里,每一行都是进步的足迹,每一次挑战都是成长的机遇。”

Java OOM 问题排查思路

OOM(Out Of Memory,内存溢出)问题是比较棘手的情况,下面讲一些常见的排查思路。

一、利用监控系统查看内存情况

  1. Prometheus + Grafana 组合
    可以借助 Prometheus 与 Grafana 这套搭配来监控内存使用状况。
  2. 阿里的 ARMS 工具
    阿里的 ARMS 也是个好用的监控应用内存的工具。用它来监控应用内存,能帮我们发现内存泄漏这类问题。要是发现内存一直在增长却不释放,那就很可能存在内存泄漏隐患,就有可能引发 OOM 问题。

二、运用 jmap 命令保存内存镜像及相关操作

  1. 保存堆内存镜像
    可以使用 jmap 命令来保存堆内存的镜像。不过更建议大家配置好 jvm 参数,让系统在崩溃的时候自动保存快照就行。例如在出现 OOM 导致崩溃时,有了这个快照,后续就能通过它去分析当时内存里具体是啥情况,像各个对象是咋分布的、内存占用结构如何等,这对查找问题根源很有帮助。常用命令像 “jmap -dump:live,format=b,file=heapdump.hprof”,按照这个格式写上对应的进程 ID,就能把存活对象的堆内存信息以二进制格式保存下来。(生产环境不建议直接这样操作,线上环境的堆内存可能很大,要是特别大的保存会影响服务运行)
  2. 借助 jmap 和 jstatck 查看内存比例
    还能用 jmap 和 jstatck 这俩命令去查看活跃的对象以及老年代新生代的内存比例。要是查看时发现老年代占比过大,就要注意,很有可能出现了内存泄漏情况,一直发展下去大概率就会导致 OOM 问题发生。所以当怀疑内存有异常时,不妨执行这俩命令来瞧瞧具体情况。
  3. jstat -gc <进程 ID> <采样间隔时间(毫秒)> <采样次数>
  4. 使用内存分析工具 将对内存的快照文件导入进去分析,如果有内存泄漏可以具体定位到具体的代码。

Write your comment Here