每当您发现自己盯着其中带有OutOfMemoryError的堆栈跟踪时,都应该清晰可见。 该程序不再有肘部空间,并且由于缺少它而濒临死亡。 从10,000英尺或高管椅子上可能已经包含了太多信息。 但是,那些必须构建或维护应用程序并弄清为什么会产生特定错误的人员–我们可以对问题进行更多的了解。

在本文中,我们将了解不同的OutOfMemoryError消息的实际含义。 我们从最常见的情况开始,然后发展到更有趣的情况。

  • java.lang.OutOfMemoryError:Java堆空间
  • java.lang.OutOfMemoryError:PermGen空间
  • java.lang.OutOfMemoryError:超出了GC开销限制
  • java.lang.OutOfMemoryError:无法创建新的本机线程
  • java.lang.OutOfMemoryError:nativeGetNewTLA
  • java.lang.OutOfMemoryError:请求的数组大小超出了VM限制
  • java.lang.OutOfMemoryError:请求<reason>的<size>个字节。 交换空间不足?
  • java.lang.OutOfMemoryError:<原因> <堆栈跟踪>(本机方法)

java.lang.OutOfMemoryError:Java堆空间。 我们从大家看到的比实际想要的更多的视频开始。 这是Java虚拟机通知您虚拟机堆区域中没有更多空间的方式。 您正在尝试创建一个新的对象,但是这个新创建的结构将要消耗的内存量超过了JVM在堆中的拥有量。 JVM试图通过在丢弃之前调用完整的GC来释放内存,但没有成功。 消除症状的最快方法是通过-Xmx参数增加堆。 请注意,本文中的该建议或其他建议均应与一粒盐一起服用。 很多时候,您最终只会隐藏潜在问题的症状。

下一嫌疑人也很常见。 我想你们大多数人在重新部署期间都看到了java.lang.OutOfMemoryError:PermGen空间。 它与第一个消息几乎是相同的消息,但是现在您正在尝试在永久代区域中分配内存,而不是堆。 同样,您没有足够的空间,因此JVM本机代码足以让您了解它。 如果增加-XX:MaxPermSize参数,则此消息趋于消失(一段时间)。

第三个-java.lang.OutOfMemoryError:超出了GC开销限制-是有点不同的野兽。 JVM没有发出丢失的堆/ permgen的信号,而是表明您的应用程序在垃圾回收中花费了太多时间而几乎没有显示。 默认情况下,如果您在GC中花费了总时间的98%以上,并且在GC中恢复了不到2%的堆之后,则JVM配置为抛出此错误。 听起来像是一个完美的好地方,可以采用“快速故障”防护措施。 在极少数情况下需要禁用它,请在启动脚本中添加-XX:-UseGCOverheadLimit

前三个OutOfMemoryError消息最多执行我们使用Plumbr解决的情况的98%。 因此,您很有可能不知道其余的三重奏。

java.lang.OutOfMemoryError:如果JVM向操作系统请求新线程并且基础OS无法再分配新线程,则您将收到一条消息:无法创建新的本机线程。 此限制与平台密切相关,因此,如果您想知道自己的限制,请使用以下代码段运行自己的小实验。 在运行最新JDK 7的64位MacOS X上,创建线程#2032时遇到麻烦。

while(true){new Thread(new Runnable(){public void run() {try {Thread.sleep(10000000);} catch(InterruptedException e) { }        }    }).start();
}

java.lang.OutOfMemoryError:nativeGetNewTLA是JVM无法分配新线程本地区域的症状。 这是您仅在jRockit虚拟机上遇到的问题。 如果您还记得的话,线程局部区域是用于在多线程应用程序中有效分配内存的缓冲区。 每个线程都有其自己的预分配缓冲区,该线程实例化的所有对象都在该缓冲区中出生。 在高度多线程的应用程序中创建大量对象时,您会遇到问题,在这种情况下,您可能需要调整-XXtlaSize参数。

java.lang.OutOfMemoryError:所请求的数组大小超出VM限制,这是一条消息,当您尝试创建大于VM限制所允许的数组时,您会发现自己一直盯着它。 在具有最新JDK 7版本的64位Mac OS X上,我发现自己承认一个事实,即带有Integer.MAX_INT-2元素的数组是可以的,但是如果再加上一根稻草(即Integer.MAX_INT-1),则会破坏骆驼的后背。 在较旧的32位计算机上,它具有限制阵列大小以适合当时可用的微小堆的优点。 在现代的64位计算机上,似乎比实际解决任何问题都造成更多的混乱。

java.lang.OutOfMemoryError:请求<reason>的<size>个字节。 交换空间不足? 当JVM无法从OS分配本机内存时,将引发此错误消息。 请注意,这与您用尽堆空间或permgen空间的标准情况完全不同。 当您在平台限制附近操作时,往往会显示此消息。 消息本身说明您可能已经超出了可用的物理和虚拟内存量。 由于后者通常是通过将内存交换到磁盘来实现的,因此您可能会想到的快速解决方案是增加交换文件的大小。 但是我还没有看到在交换时会正常运行的应用程序,因此这种快速修复很可能对您没有太大帮助。

java.lang.OutOfMemoryError:<原因> <堆栈跟踪>(本机方法)现在该向其他C开发人员求助了。 消息表明您面临本机代码的问题,但与最后一种情况相反,是在JNI或本机方法而不是JVM代码中检测到分配失败。

文章中的所有建议都应加盐。 很多时候,您最终只会隐藏潜在问题的症状。 如果要确保这些消息不是由内存泄漏引起的,请免费下载并试用Plumbr 。

参考: Plumbr博客博客上的JCG合作伙伴Nikita Salnikov Tarnovski理解了OutOfMemoryError 。

翻译自: https://www.javacodegeeks.com/2013/08/understanding-the-outofmemoryerror.html

了解OutOfMemoryError相关推荐

  1. java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得

    该文章出自:http://www.cnblogs.com/hucn/p/3572384.html 分析工具:http://www.blogjava.net/jjshcc/archive/2014/03 ...

  2. java.lang.OutOfMemoryError: PermGen space及其解决方法

    PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决 ...

  3. JVM 有 Full GC,为什么还会出现 OutOfMemoryError呢?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:zhihu.com/question/38511221 平时 ...

  4. 既然 JVM 有 Full GC,为什么还会出现 OutOfMemoryError?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:R 大 zhihu.com/question/3851122 ...

  5. 深入解析Java OutOfMemoryError

    在Java中,所有对象都存储在堆中.他们通过new关键字来进行分配,JVM会检查是否所有线程都无法在访问他们了,并且会将他们进行回收.在大多数时候程序员都不会有一丝一毫的察觉,这些工作都被静悄悄的执行 ...

  6. 调整JVM堆内存解决OutOfMemoryError

    今天在用 processing(http://zh.wikipedia.org/wiki/Processing) 编写处理 midi 文件的程序的时候,遇到了一个问题.程序主要是读取分析 midi , ...

  7. java.lang.OutOfMemoryError: Java heap space错误及...

    为什么80%的码农都做不了架构师?>>>    以下是从网上找到的关于堆空间溢出的错误解决办法: java.lang.OutOfMemoryError: Java heap spac ...

  8. Java中的OutOfMemoryError的各种情况及解决方法

    转载自博客园:https://www.cnblogs.com/duanxz/p/4901437.html Java中的OutOfMemoryError的各种情况及解决和JVM内存结构 在JVM中内存一 ...

  9. 【JVM】StackOverflowError与OutOfMemoryError

    · StackOverflowError与OutOfMemoryError是JVM中常见的有关内存的异常,需结合JVM来: · 在理解.区分这两个异常前,需要知道JVM中运行时数据区的结构:[见图1的 ...

  10. java.lang.OutOfMemoryError: Java heap space的解决办法

    如果在启动过程中出现内存溢出问题,抛出类似如下异常信息: java.lang.OutOfMemoryError: Java heap space 可以尝试办法: A.修改Tomcat/bin/cata ...

最新文章

  1. R语言ggplot2可视化绘制一头奶牛、Linux下使用cowsay打印奶牛(cow)
  2. To be a true man
  3. 在单块磁盘上安装2000和XP操作系统
  4. Ogre源码在VS2008(VC9)中的配置方式
  5. 【Python】青少年蓝桥杯_每日一题_7.19_电梯用量
  6. 为什么redis取出来是null_跳表:为什么Redis一定要用跳表来实现有序集合
  7. 安装docx模块出现Import Error: No module named 'exceptions'的解决方案
  8. 程序员精进之路:性能调优利器--火焰图
  9. 小程序调用阿里云身份证识别OCR(附带七牛云上传图片)
  10. Weblogic 节点启动
  11. 方程组的直接解法和迭代法 python_基于任务驱动的翻转课堂线上教学 ——以《解二元一次方程组复习课》为例...
  12. sip系统完整性是什么?SIP系统完整性保护关闭方法(含M1)
  13. selenium-远程调用
  14. 数据恢复国赛经验与方法分享(电子产品芯片级检测维修与数据恢复赛项)
  15. 切换电脑计算机名称软件,多电脑切换器
  16. Qt5--学习笔记-+openCV2-客户端、服务端回环视频显示
  17. js面试题Foo.getName()的故事
  18. 实验吧CTF练习题---安全杂项---异性相吸解析
  19. 半导体测试---测试基础原理之OS
  20. 爱心表白代码HTML

热门文章

  1. AliOS Things KV组件的写平衡特性
  2. Centos 6 常用服务部署命令说明
  3. 两个函数彻底理解Lua中的闭包
  4. Ambari Metrics Monitor/Sink 架构
  5. 十二 手游开发神器 cocos2d-x editor 之游戏暂停悬浮层
  6. CentOS6.3挂载读写NTFS分区
  7. 网络主机监控-nagios应用漫谈(三)
  8. Hlink的Analysis基本搞定了
  9. golang web 静态文件
  10. python 文本模式读写文件时 不应使用 os.linesep 简介