发生以下情况之一时,可能会引发OutOfMemoryError

  • JVM耗尽了本机内存
  • Java堆内存不足
  • PermGen或Metaspace内存不足
  • JVM花太多时间试图收集垃圾

通常可以从错误消息中OutOfMemoryErrorOutOfMemoryError的根本原因。 让我们研究每种情况的细节。

JVM耗尽了本机内存

这基本上意味着分配给JVM的内存量已用完。 32位JVM的最大进程大小约为3.5 – 4 GB。 如果超过它,将OutOfMemoryError 。 即使在64位JVM中,当JVM请求更多内存时,操作系统也可能根本没有足够的内存。 请看以下片段:

for (int i = 0; true; ++i) { new Thread() { public void run() { try { Thread.sleep(1000000); } catch(InterruptedException e) { } } }.start(); System.out.println("Thread"; + i + "created");
}

在我的笔记本上(带有Java 1.8.0_112的64位Mac OS X 10.11.6),在创建2023个线程之后,JVM崩溃了:

Thread 2021 created
Thread 2022 created
Thread 2023 created
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread

Java堆内存不足

这个很明显。 分配了太多对象,因此它们不适合为JVM配置的堆空间。 增大堆大小听起来像是一种解决方案,但是如果它是由内存泄漏引起的,则只会推迟OutOfMemoryError 。 错误消息非常清楚:

Exception in thread “main” java.lang.OutOfMemoryError: Java heap space

PermGen或Metaspace内存不足

PermGen(Java 7和更早版本)的最大大小有限 。 这意味着如果加载了太多的类,PermGen可能会填满,并且将引发OutOfMemoryError 。 增加最大PermGen大小应该会有所帮助。 Java 8没有PermGen,但是有Metaspace。 默认情况下,它具有无限制的最大大小,因此,只要您不通过MaxMetaspaceSize标志设置限制,就不应引发该错误。 要诊断由PermGen或Metaspace引起的OutOfMemoryError ,应检查错误消息:

Exception in thread “main” java.lang.OutOfMemoryError: PermGen space
Exception in thread “main” java.lang.OutOfMemoryError: Metaspace

JVM花太多时间试图收集垃圾

这是最棘手的问题–当GC花太多时间收集垃圾而导致的结果太少并且进一步执行应用程序毫无意义时,将引发OutOfMemoryError 。 换句话说,必须满足以下 所有 条件

  • GC中花费了超过98%的时间(98%是默认值,可以被GCTimeLimit=N覆盖)
  • 在完整GC期间,只有不到2%的堆被回收(再次,2%是默认值,可以被GCHeapFreeLimit=N覆盖)。
  • 前面提到的两个条件都适用于五个连续的完整GC周期
  • UseGCOverheadLimit标志未禁用(true为默认值)

运行完整的GC意味着JVM总是耗尽内存。 如果花费了98%的时间来释放2%的堆,则意味着CPU几乎完全忙于GC,几乎无法完成任何应用程序逻辑。 这就是为什么放弃并抛出OutOfMemoryError并显示以下消息的原因:

Exception in thread “main” java.lang.OutOfMemoryError: GC overhead limit exceeded

翻译自: https://www.javacodegeeks.com/2017/08/what-causes-outofmemoryerror.html

是什么原因导致OutOfMemoryError?相关推荐

  1. 网站收录慢的如“蜗牛”,是什么原因导致的?

    在日常的网站优化中,很多优化人员可能都会遇到网站收录慢的问题,也不是没有收录,但收录就是慢,甚至又慢又少,导致网站排名迟迟上不去,让人很是无奈.要想解决问题,就要找到问题的关键,那么,网站的收录速度慢 ...

  2. 什么原因导致挖掘机老自动熄火憋车熄火?

    挖机熄火相信大部分挖友都在作业过程中碰到过这个故障!那么,挖掘机是什么原因导致自动熄火?以及憋车熄火要如何排查维修呢?下面小编为您整理了相关解决方案: 一般来说,挖掘机常见的熄火故障主要有四种: 发动 ...

  3. 指定的服务器无法运行请求操作_服务器无法正常运行?也许是这3个原因导致的!...

    作者:BlueHost 来源:今日头条 服务器相对其他类型的主机稳定性更高,但其复杂的构造也导致不稳定的影响较多,主要表现在网站打不开或加载速度不一,后台需要重复登录等.服务器设备运行复杂,在没有专业 ...

  4. h桥控制电机刹车_082 电机驱动桥集成式的结构,定速比10左右,松油门或轻踩刹车瞬间,出现齿轮撞击的情况,是什么原因导致的?应该采取什么措施?...

    神行问答082: 电机驱动桥集成式的结构,定速比10左右,松油门或轻踩刹车瞬间,出现齿轮撞击的情况,是什么原因导致的?应该采取什么措施避免? 参考答案: 参考答案1: 齿轮间隙无法完全消除,主要是标定 ...

  5. 服务器系统杀毒系统崩溃怎么恢复,系统崩溃是什么原因导致的

    大家在使用电脑的时候,经常都是需要安装一些软件和其他东西的.但是在安装软件的时候,很容易让一些病毒侵入电脑.一旦病毒侵入了电脑,就很容易让电脑系统崩溃.那么系统崩溃是什么原因导致的呢?下面就来告诉大家 ...

  6. 萤石云设备下线是什么导致的_什么原因导致化工设备腐蚀?腐蚀防护措施有哪些?...

    关键词:化工设备腐蚀,化工设备腐蚀原因,化工设备腐蚀防护 在化工行业中腐蚀破坏到处可见,腐蚀事故频频发生.这除了因腐蚀本身所具有的自发性质外,很大程度上是因为人们对腐蚀的危害性认识不足,对腐蚀防护的重 ...

  7. java.net.MalformedURLException: unknown protocol: c 这个错一般有两种原因导致: 1、URL协议、格式或者路径错误,...

    java.net.MalformedURLException: unknown protocol: c这个错一般有两种原因导致:1.URL协议.格式或者路径错误, 好好检查下你程序中的代码如果是路径问 ...

  8. 微信语音能保存多久服务器,微信语音播放失败?可能是这几个原因导致的,看完你就懂了...

    很多朋友在使用手机播放其他好友发送给自己的语音消息时,会出现"语音播放失败"的提示,不知道是什么原因导致的,本期文章就说说导致微信语音播放失败的几个原因,以及可行的解决办法. 一. ...

  9. 网页服务器卡是什么原因吗,网速很快但打开网页速度很慢什么原因导致的

    我们使用电脑和手机时候最不能忍受就是设备又卡又慢了,严重影响我们工作或者游戏体验.有时用户打开网页的速度慢,是因为其中某个环节出了问题,或者不够优化.下面笔者整理简要总结下网页打开速度慢的原因,主要有 ...

最新文章

  1. 【转】关于Ubuntu的sources.list 的总结
  2. 50.什么是内部碎片?什么是外部碎片?
  3. 【Verilog】基于Nexys4DDR开发板实现数字钟
  4. 网站的Http请求转为Https请求
  5. Dynamics CRMのアップデートインポートツール移植的准备步骤与有用的网页
  6. 我的第一份vim程序
  7. PDF数据防扩散系统方案
  8. 阿里Java开发手册——如何优化数据库?
  9. [Unity] 无脚本导出 Texture 为 PNG
  10. 荣耀50系列外观配置抢先看:售价成唯一悬念
  11. 配置ANDROID开发环境的方法
  12. 【java学习之路】(javaWeb【后端】篇)007.AjaxAxios
  13. 值得收藏的130个神器网站
  14. 【分享】如何创建自己的Visual Studio 2005/2008配色
  15. linux之替换开机logo
  16. 小米5splus安装鸿蒙OS,小米5Splus 魔趣OS 安卓10 MagiskV21版 完美ROOT 纯净完美 原生极简 纯净推荐...
  17. 软件工程 实践者的研究方法 第12章答案
  18. 如何在手机上查看SQLite文件
  19. 胡凡算法之——全排列问题
  20. 游戏纽约夜生活java汉化_纽约玩乐--夜生活开启诱惑模式

热门文章

  1. VMware15启动虚拟机导致win10 pro蓝屏问题解决
  2. 使用jdbc驱动连接mysql_使用jdbc连接mysql数据库
  3. 四川大学通报:现场挡获一男生在女卫生间偷拍!开除学籍!
  4. Sql语言如何拼接数据?
  5. #互联网广告#复杂网络机遇和挑战(十大问题)
  6. Linux iftop 安装与参数详解 【转】
  7. 管理工具(hgdbdeveloper)连接安全版报字段c.relhasoids不存在
  8. 胎压监测方案设计--TPMS方案
  9. MySQL学习笔记 04、MySQL进阶(索引、事务、锁)
  10. oracle24801错误,Access数据库通过ODBC导出到Oracle的两个小问题ora-24801\Ora-01401