如果线上遇到了OOM,该如何解决?(二)

发布于 2022-6-21 16:25
浏览
0收藏

 

Dump 文件分析 
Dump 文件是 Java 进程的内存镜像,其中主要包括 系统信息、虚拟机属性、完整的线程 Dump、所有类和对象的状态 等信息

 

当程序发生内存溢出或 GC 异常情况时,怀疑 JVM 发生了 内存泄漏,这时我们就可以导出 Dump 文件分析

 

JVM 启动参数配置添加以下参数

  • -XX:+HeapDumpOnOutOfMemoryError
  • -XX:HeapDumpPath=./(参数为 Dump 文件生成路径)


当 JVM 发生 OOM 异常自动导出 Dump 文件,文件名称默认格式:java_pid{pid}.hprof


上面配置是在应用抛出 OOM 后自动导出 Dump,或者可以在 JVM 运行时导出 Dump 文件

jmap -dump:file=[文件路径] [pid]

# 示例
jmap -dump:file=./jvmdump.hprof 15162

 

在本地写一个测试代码,验证下 OOM 以及分析 Dump 文件

设置 VM 参数:-Xms3m -Xmx3m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./

public static void main(String[] args) {
    List<Object> oomList = Lists.newArrayList();
   // 无限循环创建对象
    while (true) {
        oomList.add(new Object());
    }
}

通过报错信息得知,java heap space 表示 OOM 发生在堆区,并生成了 hprof 二进制文件在当前文件夹下

 如果线上遇到了OOM,该如何解决?(二)-开源基础软件社区
JvisualVM 分析

Dump 分析工具有很多,相对而言 JvisualVM、JProfiler、Eclipse Mat,使用人群更多一些。下面以 JvisualVM 举例分析 Dump 文件

 如果线上遇到了OOM,该如何解决?(二)-开源基础软件社区
列举两个常用的功能,第一个是能看到触发 OOM 的线程堆栈,清晰得知程序溢出的原因

 如果线上遇到了OOM,该如何解决?(二)-开源基础软件社区
第二个就是可以查看 JVM 内存里保留大小最大的对象,可以自由选择排查个数

 如果线上遇到了OOM,该如何解决?(二)-开源基础软件社区
点击对象还可以跳转具体的对象引用详情页面

 如果线上遇到了OOM,该如何解决?(二)-开源基础软件社区
文中 Dump 文件较为简单,而正式环境出错的原因五花八门,所以不对该 Dump 文件做深度解析

注意:JvisualVM 如果分析大 Dump 文件,可能会因为内存不足打不开,需要调整默认的内存

总结回顾 
线上如遇到 JVM 内存溢出,可以分以下几步排查

  • jmap -heap 查看是否内存分配过小
  • jmap -histo 查看是否有明显的对象分配过多且没有释放情况
  • jmap -dump 导出 JVM 当前内存快照,使用 JDK 自带或 MAT 等工具分析快照
    如果上面还不能定位问题,那么需要排查应用是否在不断创建资源,比如网络连接或者线程,都可能会导致系统资源耗尽

创作不易,文章看完有帮助,点关注支持一下,祝好

 

文章转自公众号:龙台的技术笔记

标签
已于2022-6-21 16:25:52修改
收藏
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐