是什么原因导致OutOfMemoryError?

发生以下情况之一时,可能会引发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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10电脑开机密码忘了怎么办_Mac电脑忘记开机密码怎么办?Mac开机密码快速恢复方法...

Mac忘记开机密码怎么办?虽然小编觉得大多数人应该都不会Mac忘记开机密码,但是如果真的有人忘记了怎么办呢?小编这里教你们一种方法,可以帮你1分钟快速恢复Mac电脑忘记开机密码,感兴趣的朋友快跟着小编一起来看看吧&…

技术管理规划-如何规划团队的架构

管理规划的4个要素 1.职能【清楚自己团队的基本职责和使命】 2.目标【为团队设定清晰的目标】 3.团队【团队的架构规划】 4.路径 团队目标 根据团队目标去梳理团队 团队目标: 某个时间节点,团队发展成什么状态。 要点说明规模实际人数和预算人数分工团队…

win10家庭版调出组策略_利用powershell为win10家庭版安装组策略

虽然win10家庭版阉割了组策略管理器,但至少到1607版本时还可以用cmd脚本安装它。可是随后win10更新了几个大版本,不知为何,cmd控制台常常会有诡异的Bug,导致无法用老办法安装组策略管理器。为了彻底解决这个问题,不妨另…

Spring批处理CSV处理

总览 我们将讨论的主题包括使用Spring Batch进行批处理的基本概念,以及如何将数据从CSV导入数据库。 0 – Spring Batch CSV处理示例应用程序 我们正在构建一个应用程序,该应用程序演示Spring Batch处理CSV文件的基础。 我们的演示应用程序将允许我们处…

NOIP模拟测试28「阴阳·虎·山洞」

写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方案必须满足任意两个同颜色格子之间的格子也必须是该颜色。 然后我们…

linux设置环境变量_什么是linux环境变量

本来这篇文章好几天之前就写好了,但是媳妇儿跟我说工作日就不要发了,大家都在上班,哪有闲心思看你的文章。哎,可能大家用头条都是在放松刷娱乐,看小姐姐。所以就一直拖到现在。周末了,更是放松的好时候&…

理科卷math·english·chinese·biology·chemistry·physics

一套比一套炸,果然我只会做B卷,虽然我B也很差但没差到这种地步 $math$ 题解 看似没法做但总会有突破口 $70\%$ 发现和小凯的诱惑很像,于是看$gcd$是否为$1$只要为$1$可以凑齐所有数 $n^2$枚举两两$gcd$ $80\%$ 我考试时思路 找到每一个数和$mod$的$gcd$,发现只要是任一$gcd$倍数…

cad卸载_怎么把CAD卸载干净,老司机来教你

CAD经常出现文件丢失啊、这样那样的提示,要是身边有个大神级朋友还好,没有的小盆友只能乖乖的卸载,重新安装了,那么又有个问题拦住我们了——怎么把CAD卸载干净呢?由于卸载不干净,再次安装CAD时&#xff0c…

什么是JavaServer Faces(JSF)–(第2部分)

Facelets声明语言 在第1部分中,我介绍了JavaServer Pages(JSF)背后的基本思想 。 在本文中,我想介绍Facelets声明语言 。 HTML标签 我们遇到的第一个标签是代表HTML元素HTML标签。 这些实际上只是HTML标记(例如输入&a…

问题 1076: 内部收益率

问题 1076: 内部收益率 时间限制: 1Sec 内存限制: 128MB 提交: 418 解决: 169 题目描述在金融中,我们有时会用内部收益率IRR来评价项目的投资财务效益,它等于使得投资净现值NPV等于0的贴现率。换句话说,给定项目的期数T、初始现金流CF0和项目…

路由器上的usb接口有什么用_路由器的USB接口,非常强大的功能,教您轻轻松松玩转,太实用了...

新一代出来的路由器后面基本上都会有一个或者是两个以上的有USB接口。居然还有很多人都不知道这些,要是比接口的用处。只是把它当做普通的无线路由器用。这样子太可惜了。其实路由器后面的usb接口呀,它有非常强大的功能,好处多多。接下来就请…

关于全局缓存的一种简单实现方法

缓存&#xff0c;在.Net系统开发中&#xff0c;经常使用到。如果&#xff0c;让你自己去实现&#xff0c;你会怎么做呢。 开始编码前思考&#xff1a; 1、肯定 是要 根据 key 去查询对应value&#xff0c;so 应该是List<KeyValuePair> 这类集合做缓存载体&#xff1b; 2、…

Lombok–您绝对应该尝试一下

Lombok在Java生态系统中并不是什么新鲜事物&#xff0c;但是我必须承认&#xff0c;直到我尝试使用它或被“确信”尝试它之前&#xff0c;我总是低估了它的价值。 我发现添加一个库来生成代码的价值并不高&#xff0c;这些库可以被当今的任何现代IDE轻松生成。 因此&#xff0c…

苹果手机透明桌面_原来苹果手机辨别真假这么简单!查看桌面1个图标,就能轻松分辨...

要说哪个品牌的手机贵&#xff0c;大家想到的肯定是苹果手机啦&#xff0c;所以说很多朋友都害怕自己买到假货。其实分辨苹果手机是不是正品很简单&#xff0c;只需学会这两个方法&#xff0c;就能辨别出手机的真假哦。一、从细节入手1.桌面时钟不知道大家发现没&#xff0c;iP…

NOIP模拟测试34「次芝麻·呵呵呵·长寿花」

次芝麻 题解 大力打表,发现快速幂, 例如初始$5$ $6$,那么第一次就是$5*2\%1110$,$6*2\%111$. 代码 #include<bits/stdc.h> using namespace std; #define ll long long ll n,m,k,d; ll g(ll x,ll k,ll s1){for(;k;k>>1,xx*x%d)if(k&1) ss*x%d;return s; } int …

Java Bean验证基础

这篇文章总结了一些简单易用的示例&#xff0c;这些示例说明了您想使用Java Beans Validation API&#xff08;JSR 349&#xff0c;JSR 303&#xff09;进行的最常见操作。 记住&#xff0c;Beans Validation独立于Java EE。 尽管它是作为Java EE兼容服务器的一部分内置的&…

NOIP模拟测试「简单的区间·简单的玄学·简单的填数·简单的序列」

简单的区间 $update$ 终于$AC$了 找到$(sum[r]sum[l](sum表示以中间点为基准的sum)-mx)\%k0$的点 注意这里$sum$表示是以$mid$为基准点,(即$sum[l]$为后缀和,$sum[r]$为前缀和) 回忆$(sum[r]-sum[l])\%k0$这个经典问题做法(入阵曲简化版),开桶,桶里维护$sum[l]\%k$,那么$r$贡献…

苹果手机变卡了怎么解决_iOS 变卡怎么解决?一招搞定!无需刷机

iOSiOS 因为其优秀的底层交互逻辑&#xff0c;能让一部 iPhone 在不跨版本更新系统的前提下&#xff0c;至少保证 2 年内如新机般流畅。两年之后呢&#xff1f;你是否为手中的老将渐衰而苦恼过&#xff1f;本人对手机的流畅度十分敏感&#xff0c;可以说到了极致。付款时&#…

NOIP模拟测试38「金·斯诺·赤」

金 辗转相减见祖宗 高精 #include<bits/stdc.h> using namespace std; #define A 2000 #define P 1 #define N 10 #define ll long long ll n,T; char sjdfj[A]; struct bignum {ll n[A],l;bignum(){l1,memset(n,0,sizeof(n));}void clear(){while(l>1&&!n[l-…

什么是JSON处理(JSON-P API)?

Java EE中的JSON-P简介 JSON处理1.0&#xff08; JSR 353 &#xff09;的Java API是一个低级&#xff0c;轻量级的JSON解析器和生成器&#xff0c;它提供了在属性和值级别上操作JSON数据的能力。 JSR 353提供了两种JSON处理模型&#xff1a; 对象模型和流模型。 两种模型都可以…