二、OutOfMemoryError内存溢出

来源:互联网 发布:app免费下载软件 编辑:程序博客网 时间:2024/06/06 14:44

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 0
原创粉丝点击