你了解OutOfMemoryError吗?

你了解OutOfMemoryError吗?

你在开发过程中遇到过OutOfMemoryError 这个异常吗?知道为啥会出现这个异常么?嘿嘿。。。听B哥给你叨叨叨

简单明了——此文目的有两个:

  • 通过代码验证Java虚拟机中各个区域存储的内容
  • 希望读者在工作中遇到了实际的内存溢出时,能根据异常信息快速判断是哪个区域出现内存溢出以及出现溢出后如何处理。

首先容我贴个图:
上图是JVM虚拟机运行时的数据区,除了程序计数器以外,虚拟机的其他几个运行时区都有可能发生OutOfMemoryError异常(简称OOM),来分别分析下都有哪些情况下会产生OOM。

  1. Java 堆溢出
    java堆用来存储对象实例,只要你不断的去创建对象,并且保证这些对象不被垃圾回收机制清除(保证GC Root到对象有可达路径),那么当对象数量到达堆的最大容量限制后,就会产生OOM

    **对象数量>堆容量 =OOM**
    

java 堆异常测试:
在这里插入图片描述
返回结果:
在这里插入图片描述
分析原因:

当出现java 堆内存溢出时,异常堆栈信息java.lang.OutOfMemoryError: 会跟着 Java heap space
如果是内存泄露,找出泄露对象是怎样与GC roots相关联,找到泄露对象的内存信息以及GC root引用链的信息,就能找到泄露对象代码的位置
如果不是内存泄露,检查堆的设置参数,以物理机内存进行对比,看是否能够调大,优化配置。

  1. 虚拟机栈和本地方法栈溢出

    如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。
    如果虚拟机再扩展时无法申请到足够的空间,将抛出OOM。

栈溢出测试
在这里插入图片描述
返回结果:
在这里插入图片描述

  1. 方法区溢出

    方法区用于存放Class 的相关信息,如类名,访问修饰符,常量池,字段描述,方法描述等。
    如果运行时产生大量的类去填充这个区域,会导致OOM。
    在这里插入图片描述

  2. 本机内存直接溢出
    DirectMemory容量可通过 -XX :MaxDirectMemorySize指定,如果不指定,则默认与堆的最大值一样。

在这里插入图片描述

在这里插入图片描述
如果你发现OOM后,Dump文件很小,而程序中直接或者间接的使用了NIO,那就考虑下是不是本机内存溢出了。

【参考】《深入理解Java虚拟机(第二版)》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值