几种内存溢出

1. 堆(共享)内存溢出java.lang.OutOfMemoryError: Java heap space

Java堆用于存储对象实例,对象数量达到最大容量后产生内存溢出

-verbose:gc -Xms20M -Xmx20M -Xmm10M -XX:+PrintGCDetails -XX:SurvivorRatio=8

处理:①用内存映像分析工具如Eclipse Memory Analyzer对dump出来的堆转储快照进行分析,确定内存中的对象是否是必要的,也就是到底是内存泄漏(Memory Leak)还是内存溢出(Memory Overflow) ②如果是内存泄漏,那么查看泄漏对象到GC Roots的引用链(对象与GC Roots的关联路径,有这条路径在,GC就不会去清理这个对象),再定位到泄漏代码 ③如果是内存溢出,那么检查JVM参数是否可以加大,检查代码上是否存在某些生命周期过长的情况以及其他减少运行期内存的方法

2. 虚拟机栈和本地方法栈(私有)满栈java.lang.StackOverflowError

栈存储的是局部变量,当局部变量过多,栈深度大于虚拟机允许的深度时报异常

-Xss128k(每个线程栈分配的内存)

内存溢出java.lang.OutOfMemoryError: unable to create new native thread

线程扩展时无法申请空间,导致无法创建更多的线程|-Xss128k|通过减少最大堆和减少栈容量(线程大小)来换取更多的线程

3. 方法区(共享)运行时常量池溢出java.lang.OutOfMemoryError: PermGen space

常量池存储的是常量和静态变量

-XX:PermSize和-XX:MaxPermSize

方法区溢出java.lang.OutOfMemoryError: PermGen space

方法区存储的是Class相关的信息,一般是动态生成大量Class的应用中会遇到

4. 本机直接内存内存溢出java.lang.OutOfMemoryError

JVM 进程空间中,Java Heap 以外的内存空间称为 JVM 的 native memory。进程的很多资源都是存储在 JVM 的 native memory 中,例如载入的代码映像,线程的堆栈,线程的管理控制块,JVM 的静态数据、全局数据等等。也包括 JNI 程序中 native code 分配到的资源。

-XX:MaxDirectMemorySize

OutOfMemoryError 后面不接是哪个内存块,那就是直接内存溢出

相关文章