二、OutOfMemoryError内存溢出

1.Java堆溢出

      Java堆溢出是实际应用中最常见的内存溢出异常情况。出现Java堆溢出时,异常堆栈信息“java.lang.OutOfMemoryError”后面会紧跟着进一步提示“java heap space”。
      要解决这个区域的异常,一般的手段是首先通过内存映像分析工具对dump出来的堆转储快照进行分析,重点是确认是内存泄漏还是内存溢出。若是内存泄漏,可以进一步通过工具查看泄露对象到GC Roots的引用链,从而找到泄露的代码。若不存在内存泄漏,则应当检查虚拟机堆的参数看能否调大,再看代码中是否存在某些对象的生命周期过长的情况

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

      如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。
      如果虚拟机在扩展栈时无法申请到足够的内存空间,则会抛出OutOfMemoryError异常。
      在单线程中,无论是由于栈帧太大,还是虚拟机栈容量太小,当内存无法分配时,虚拟机抛出的都是StackOverflowError异常,可以通过阅读错误堆栈信息找到代码位置。
       如果是建立多线程导致的内存溢出,在不能减少线程数或更换更高配置的机器的情况下,就只能通过减少最大堆和减少栈容量来换取更过的线程。

3.运行时常量池溢出

       可以通过-XX:PermSize和–XX:MaxPermSize限制方法区的大小,从而间接限制其中常量池的容量。遇到该溢出,会在OutOfMemoryError后面跟随提示信息“PermGen space”。

4.方法区溢出

       方法区用于存放class的相关信息,如类名、访问修饰符、常量池等。一般都是因为产生大量的类造成方法区空间满而溢出。

5.本机直接内存溢出

       DirectMemory容量可通过-XX:MaxDirectMemorySize指定,若不指定,则默认与Java堆的最大值一样。
       由DirectMemory导致的内存溢出,一个明显的特征是在Heap Dump文件中不会看见明显的异常。如果发现OOM之后Dump文件很小,而程序中又直接或间接使用了NIO,那么可以考虑是不是这方面的原因。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stranger。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值