内存溢出

本贴最后更新于 2704 天前,其中的信息可能已经沧海桑田

堆(共享)

内存溢出

  1. 异常信息:java.lang.OutOfMemoryError: Java heap space
  2. 原因:Java 堆用于存储对象实例,对象数量达到最大容量后产生内存溢出
  3. 设置:-verbose:gc -Xms20M -Xmx20M -Xmm10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
  4. 处理:
    1)用内存映像分析工具如 Eclipse Memory Analyzer 对 dump 出来的堆转储快照进行分析,确定内存中的对象是否是必要的,也就是到底是内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)
    2)如果是内存泄漏,那么查看泄漏对象到 GC Roots 的引用链(对象与 GC Roots 的关联路径,有这条路径在,GC 就不会去清理这个对象),再定位到泄漏代码
    3)如果是内存溢出,那么检查 JVM 参数是否可以加大,检查代码上是否存在某些生命周期过长的情况以及其他减少运行期内存的方法

虚拟机栈和本地方法栈(线程私有)

满栈

  1. 异常信息:java.lang.StackOverflowError
  2. 原因:栈存储的是局部变量,当局部变量过多,栈深度大于虚拟机允许的深度时报异常
  3. 设置:-Xss128k(每个线程栈分配的内存)

内存溢出

  1. 异常信息:java.lang.OutOfMemoryError: unable to create new native thread
  2. 原因:线程扩展时无法申请空间,导致无法创建更多的线程
  3. 设置:-Xss128k
  4. 处理:
    1)通过减少最大堆和减少栈容量(线程大小)来换取更多的线程

方法区(共享)

运行时常量池溢出

  1. 异常信息:java.lang.OutOfMemoryError: PermGen space
  2. 原因:常量池存储的是常量和静态变量
  3. 设置:-XX:PermSize 和-XX:MaxPermSize

方法区溢出

  1. 异常信息:java.lang.OutOfMemoryError: PermGen space
  2. 原因:方法区存储的是 Class 相关的信息,一般是动态生成大量 Class 的应用中会遇到

本机直接内存

内存溢出

  1. 异常信息:java.lang.OutOfMemoryError
  2. 原因:直接内存在 NIO 中使用,NIO 是一种基于通道和缓冲的 IO 方式,为了避免 Java 堆和 Native 堆来回复制数据,他使用 Native 函数直接分配内存,并通过 DirectByteBuffer 对象作为这块内存的引用,这个就是本机直接内存
  3. 设置:-XX:MaxDirectMemorySize
  4. 备注:OutOfMemoryError 后面不接是哪个内存块,那就是直接内存溢出
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注
  • 内存
    11 引用 • 2 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...