加入收藏 | 设为首页 | 会员中心 | 我要投稿 孝感站长网 (https://www.0712zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

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

发布时间:2021-10-19 12:39:18 所属栏目:语言 来源:互联网
导读:OOM 意味着程序存在着漏洞,可能是代码或者 JVM 参数配置引起的。这篇文章和读者聊聊,Java 进程触发了 OOM 后如何排查 常说对生产环境保持敬畏之心,快速解决问题也是一种敬畏的表现 为什么会 OOM OOM全称 Out Of Memory,表示内存耗
OOM 意味着程序存在着漏洞,可能是代码或者 JVM 参数配置引起的。这篇文章和读者聊聊,Java 进程触发了 OOM 后如何排查
 
常说对生产环境保持敬畏之心,快速解决问题也是一种敬畏的表现
 
为什么会 OOM
OOM全称 “Out Of Memory”,表示内存耗尽。当 JVM 因为没有足够的内存来为对象分配空间,并且垃圾回收器也已经没有空间可回收时,就会抛出这个错误
 
为什么会出现 OOM,一般由这些问题引起
 
分配过少:JVM 初始化内存小,业务使用了大量内存;或者不同 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),查看是否可以将虚拟机的内存调大些

(编辑:孝感站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读