如果在线上遇到了OOM,该如何解决?

为什么会 OOM?
OOM 全称 “Out Of Memory”,表示内存耗尽 。当 JVM 因为没有足够的内存来为对象分配空间,并且垃圾回收器也已经没有空间可回收时,就会抛出这个错误
为什么会出现 OOM,一般由这些问题引起
分配过少:JVM 初始化内存小,业务使用了大量内存;或者不同 JVM 区域分配内存不合理代码漏洞:某一个对象被频繁申请 , 不用了之后却没有被释放 , 导致内存耗尽
常见的 OOM
比较常见的 OOM 类型有以下几种
java.lang.OutOfMemoryError: PermGen space
Java7 永久代(方法区)溢出,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据 。每当一个类初次加载的时候 , 元数据都会存放到永久代
一般出现于大量 Class 对象或者 JSP 页面,或者采用 CgLib 动态代理技术导致
我们可以通过 -XX:PermSize 和 -XX:MaxPermSize 修改方法区大小
Java8 将永久代变更为元空间,报错:java.lang.OutOfMemoryError: Metadata space , 元空间内存不足默认进行动态扩展
java.lang.StackOverflowError
虚拟机栈溢出,一般是由于程序中存在 死循环或者深度递归调用 造成的 。如果栈大小设置过小也会出现溢出 , 可以通过 -Xss 设置栈的大小
虚拟机抛出栈溢出错误,可以在日志中定位到错误的类、方法
java.lang.OutOfMemoryError: Java heap space
Java 堆内存溢出,溢出的原因一般由于 JVM 堆内存设置不合理或者内存泄漏导致
如果是内存泄漏,可以通过工具查看泄漏对象到 GC Roots 的引用链 。掌握了泄漏对象的类型信息以及 GC Roots 引用链信息,就可以精准地定位出泄漏代码的位置
如果不存在内存泄漏,就是内存中的对象确实都还必须存活着 , 那就应该检查虚拟机的堆参数(-Xmx 与 -Xms) , 查看是否可以将虚拟机的内存调大些
小结:方法区和虚拟机栈的溢出场景不在本篇过多讨论,下面主要讲解常见的 Java 堆空间的 OOM 排查思路
查看 JVM 内存分布
[xxx@xxx ~]
另外,可以在 JVM 运行时查看最耗费资源的对象 , jmap -histo:live 15162 | more
JVM 内存对象列表按照对象所占内存大小排序
instances:实例数bytes:单位 byteclass name:类名
明显看到 CustomObjTest 对象实例以及占用内存过多
可惜的是,方案存在局限性,因为它只能排查对象占用内存过高问题
其中 “[” 代表数组,例如 “[C” 代表 Char 数组 , &
jmap -histo:live 执行此命令,JVM 会先触发 GC,再统计信息
Dump 文件分析
Dump 文件是 Java 进程的内存镜像,其中主要包括 系统信息、虚拟机属性、完整的线程 Dump、所有类和对象的状态 等信息
当程序发生内存溢出或 GC 异常情况时,怀疑 JVM 发生了 内存泄漏,这时我们就可以导出 Dump 文件分析
JVM 启动参数配置添加以下参数
-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=./(参数为 Dump 文件生成路径)
当 JVM 发生 OOM 异常自动导出 Dump 文件,文件名称默认格式:java_pid{pid}.hprof
jmap -dump:file=[文件路径] [pid]
设置 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 二进制文件在当前文件夹下
总结回顾
线上如遇到 JVM 内存溢出 , 可以分以下几步排查
jmap -heap 查看是否内存分配过小jmap -histo 查看是否有明显的对象分配过多且没有释放情况jmap -dump 导出 JVM 当前内存快照,使用 JDK 自带或 MAT 等工具分析快照
如果上面还不能定位问题,那么需要排查应用是否在不断创建资源,比如网络连接或者线程,都可能会导致系统资源耗尽
原文链接:https://blog.csdn.net/qq_37781649/article/details/120931207
【如果在线上遇到了OOM,该如何解决?】以上就是朝夕生活(www.30zx.com)关于“如果在线上遇到了OOM , 该如何解决?”的详细内容,希望对大家有所帮助!

猜你喜欢