当前位置: 首页 > news >正文

JVM笔记 —— 出现内存溢出错误时时如何排查

一、出现内存溢出的几种情况

内存溢出错误分为StackOverflowError和OutOfMemoryError,前者是栈中出现溢出,后者一般是堆或方法区出现溢出,简称OOM

1. 栈溢出 StackOverflowError

栈溢出一般都是因为没有正确的结束递归导致的,无限递归导致超出栈内存(-Xss)限制时就会抛出StackOverflowError。这种情况直接根据异常信息定位到代码位置进行修正即可。
在这里插入图片描述
在这里插入图片描述

2. 方法区溢出 OOM

当方法区中加载的类过多,比如通过动态代理生成很多代理类或者热部署时热加载了过多的类,多到超出方法区内存限制时(-XX:MaxMetaspaceSize),会抛出OutOfMemoryError。但这种情况一般也比较少见,如果真出现这种情况可以考虑增加MetaspaceSize,或者拆分服务,使得一个服务使用的类不超出限制。

3. 堆溢出 OOM

其实大部分OOM都是发生在堆区,当堆中存储的对象过多,GC来不及回收或者回收不掉,没有足够空间创建新对象,就会抛出OutOfMemoryError。

java.lang.OutOfMemoryError: Java heap space

二、OOM排查思路

当堆区出现OOM时,就需要我们去进行排查,看什么对象把内存吃满了

  1. 第一步:我们需要拿到发生OOM时堆区的内存快照heap dump,这里面保存了某一时刻堆中对象的情况。heap dump有两种方式可以拿到。第一种就是我们预先在jvm进程启动时开启参数配置-XX:+HeapDumpOnOutOfMemoryError,-XX:HeapDumpPath=/usr/local/oom,当发生OOM时会自动生成heap dump保存在指定路径下,这也是推荐的方式。第二种方式是如果jvm进程没有被结束,可以用工具比如jdk自带的jvisualvm手动获取指定进程id的heap dump。
  2. 第二步:将拿到的heap dump导入到分析工具中,比如说MemoryAnalyzer,通过工具分析可以看到是哪些类型对象占用了大量内存及其GC引用链,还有错误栈等信息。
  3. 第三步:根据分析得到的信息到代码中进行排查,如果是代码逻辑有问题就改代码,比如不恰当的强引用导致的内存泄漏。如果代码逻辑没问题,确实需要占这么多内存,那就考虑提升堆内存大小(-Xms -Xmx)。

参考:
https://blog.csdn.net/qq_31363843/article/details/117038001
https://blog.csdn.net/weixin_41010294/article/details/104009722

http://www.lryc.cn/news/123287.html

相关文章:

  • 多级嵌套引入组件导致Vue提示子组件未注册问题
  • vue3+element-plus组件下拉列表,数组数据转成树形数据
  • 【kubernetes】调度约束
  • 【深度学习MOT】SMILEtrack SiMIlarity LEarning for Multiple Object Tracking,论文
  • jmeter通过BeanShell对接口参数进行MD5和HmacSHA256加密【杭州多测师_王sir】
  • 基于自适应曲线阈值和非局部稀疏正则化的压缩感知图像复原研究【自适应曲线阈值去除加性稳态白/有色高斯噪声】(Matlab代码实现)
  • Spring AOP 切点表达式
  • 打破传统直播,最新数字化升级3DVR全景直播
  • 网络安全--利用awk分析Apache日志
  • 计算机视觉一 —— 介绍与环境安装
  • 如何看懂统一社会信用代码?
  • 计算机网络 运输层端口号,复用、分用
  • systrace: 系统级跟踪工具的解析
  • 关于青少年学习演讲与口才对未来的领导力的塑造的探析
  • 大数据分析案例-基于KMeans和DBSCAN算法对汽车行业客户进行聚类分群
  • Vue 3 中定义组件常用方法
  • Linux | curl命令调用接口时查看调用时长和详情
  • 用ngrok实现内网穿透,一行命令就搞定!
  • C++ 混合Python编程 及 Visual Studio配置
  • 斐波拉契数列+二进制--夏令营
  • 【使用Hilbert变换在噪声信号中进行自动活动检测】基于Hilbert变换和平滑技术进行自动信号分割和活动检测研究(Matlab代码实现)
  • Android 13 Launcher——屏蔽上拉到应用列表
  • Java 基础知识点
  • jenkins容器内CI/CD 项目失败问题
  • CRC 校验码
  • 代码随想录二刷day01
  • 【C++奇遇记】智能的函数探幽
  • 使用wxPython和PyMuPDF在Python中显示PDF目录的实现
  • 综述:计算机视觉中的图像分割
  • 【动态规划基础】数字三角形(IOI1994)