了解OutOfMemoryError

每当您发现自己盯着一个带有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

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

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

相关文章

jQuery之合成事件

jQuery提供一些方法将两种效果合并到一起&#xff0c;比如&#xff1a;mouseover、mouseout。 下面是一些案例&#xff1a; hover(over,out)一个模仿悬停事件&#xff08;鼠标移动到一个对象上面及移出这个对象&#xff09;的方法。这是一个自定义的方法&#xff0c;它为频繁使…

基础命令_1

避免误删除数据1.尽量把文件移动到 /tmp目录2.参数最小化 -f -rf3.-f或-fr放在命令最后#########################################################################################################################find 命令 <find(选项)(参数)> find命令用来在…

php pdo使用事务,PHP内PDO事务使用步骤详解

这次给大家带来PHP内PDO事务使用步骤详解&#xff0c;PHP内PDO事务使用的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。概要&#xff1a;将多条sql操作(增删改)作为一个操作单元&#xff0c;要么都成功&#xff0c;要么都失败。单条数据不用事务处理被…

[转帖]真TM长的:SQL Server 2008存储结构——GAM和SGAM、PFS结构、IAM结构、DCMBCM

谈到GAM和SGAM&#xff0c;我们不得不从数据库的页和区说起。 https://blog.csdn.net/snowfoxmonitor/article/details/49991015 一个数据库由用户定义的空间构成&#xff0c;这些空间用来永久存储用户对象&#xff0c;例如数据库管理信息、表和索引。这些空间被分配在一个或多…

六大Java功能

我花了无数小时来对不同的应用程序进行故障排除。 通过经验&#xff0c;我可以得出关于大多数开发人员应该远离的几个Java SE功能/ API的结论。 当我提到大多数开发人员时&#xff0c;我会想到常规的Java EE开发人员&#xff0c;而不是库设计人员/基础结构工程师。 全面披露&a…

解决socket 粘包的三种方法

在socket编程中&#xff0c;当服务器连续向客户机发送两条指令时&#xff0c;就容易发生粘包 解决方法 1.sleep&#xff08;&#xff09;通过睡眠来隔断两条语句 2、设置一条回执语句&#xff0c;当对方接受完信息后返回一个值 3根本解决&#xff1a; 通过在客户端程序中来确定…

用Jquery实现选项卡功能

jQuery实现选项卡功能。首先将界面搭建好。有导航头tab_menu&#xff0c;还有内容tab_box。要实现的效果就是&#xff0c;点击后&#xff0c;将相应的内容显示出来&#xff0c;其他内容隐藏掉。同时为了展现选中状态&#xff0c;为选中的项添加背景&#xff0c;以示区别。 这一…

帝国模板php代码,让帝国cms搜索页模板支持php代码

1.在/e/search/result/index.php头上加入require(../../class/functions.php);2.在/e/search/result/index.php 120行左右//替换公共模板变量$listtemp$tempr[temptext];这行代码之前加上$tempr[temptext]DtNewsBq(list.$tempr[tempid],$tempr[temptext],0);完整代码如下&#…

【刷题】BZOJ 4176 Lucas的数论

Description 去年的Lucas非常喜欢数论题&#xff0c;但是一年以后的Lucas却不那么喜欢了。 在整理以前的试题时&#xff0c;发现了这样一道题目“求Sigma(f(i)),其中1<i<N”&#xff0c;其中 表示i的约数个数。他现在长大了&#xff0c;题目也变难了。 求如下表达式的值&…

寻找缺少的堆栈跟踪

我们最近在博客中发表的一篇评论带回了有关特定体验的一些回忆。 我希望我没有经历过的那种经历。 在我们创建Plumbr之前很长时间&#xff0c;我正在调试一个应用程序&#xff0c;该应用程序每次在蓝月亮时都会给我一个例外。 详细程度令人震惊&#xff1a; java.lang.NullPoi…

HTML5--新增拖放事件(7)

前言&#xff1a; 这节课主要学习HTML5中新增的拖放事件(drag/drop)。 拖放事件 1.启用&#xff1a;HTML5中&#xff0c;如果想拖拽元素&#xff0c;给元素添加draggable true的属性&#xff0c;图像和a标签默认是可以进行拖拽的。 2.拖拽事件&#xff1a; 1.应用于被拖拽元素…

Django 用 uploadify 实现图片批量上传

分享一下在Django中使用uploadify——一个jQuery批量上传插件——的方法。github上的django-uploadify使用的是2.1.4版本&#xff0c;上传button只能使用图片&#xff0c;不能很方便的修改样式。本文针对的是uploadify 3.0.0版本。uploadify可以结合Django自身的ImageField&…

php判断记录,PHP判断数据库中的记录是否存在的方法,php数据库_PHP教程

PHP判断数据库中的记录是否存在的方法&#xff0c;php数据库本文实例讲述了PHP判断数据库中的记录是否存在的方法。分享给大家供大家参考。具体实现代码如下&#xff1a;复制代码 代码如下:$sql"select * from checklist where game_id$gid and task$task and status$stat…

Java DB中的Java存储过程

1 Java存储过程 这篇文章是关于Java DB中的Java存储过程的。 Java DB是基于Java编程语言和SQL的关系数据库管理系统。 这是Apache软件基金会的开源Derby项目的Oracle版本。 Java SE 7 SDK中包含Java DB。 在数据库内调用的Java代码是一个存储过程&#xff08;或多个过程&…

一些职场感想

教训 不要相信领导给你画的大饼 离开了&#xff0c;就不要回去 他说的为你好&#xff0c;都是套路而已 你会比你想象的更优秀 不要认为提增加工资不好意思&#xff0c;你不提&#xff0c;他永远不会给你加工资 怎么才算努力 这就看你所处的队友是怎么样的&#xff1b;如果队友是…

php聊天室发送表情,聊天室技术(六)-- 表情和动作_PHP

表情和动作极大的丰富了聊天的乐趣,一般的聊天室主要通过2种方法发送(1) 按钮菜单的方法通过在一个固定的下拉菜单里面进行选择,找到自己满意的表情,然后选中,按发送按钮发出(2) 通过手工输入代号比如网易的以手工输入 //hello 代表欢迎的一段动作,以 //bye 代表再见的一段动作…

Java 8的新增功能(第I部分-JavaFX)

免责声明&#xff1a;我不为Oracle工作&#xff0c;也不以任何方式代表Oracle。 此功能列表不是官方的。 作为“局外人”&#xff0c;这只是我研究的一部分。 Java 8已在大约两个月前完成功能&#xff0c;并且开发者预览版即将来临&#xff08;两周后&#xff09;。 这篇博客文…

mysql数据库sql语句优化

昨天帮同事优化了一个sql语句发出来共勉下: SELECT T.*, ( SELECT S.codeName FROM sys_codelist S WHERE S.codeValue T.packagingtype AND S.kindCode PACKAGING ) AS packagingtypeName, S.codeName AS codename, ( SELECT picpath FROM zl_b_gd_pic WHERE 1 1 AND gdid …

CopyPropertis

commons-beanutils.jar PropertyUtils.copyProperties(Object dest, Object orig) spring-beans.jar BeanUtils.copyProperties(Object source, Object target)CopyPropertis对List的操作需要手动转载于:https://www.cnblogs.com/xingzc/p/8663119.html

java调用外联服务用xml,Spring IOC 依赖注入的两种方式:XML和注解

IoC&#xff0c;直观地讲&#xff0c;就是容器控制程序之间的关系&#xff0c;而非传统实现中&#xff0c;由程序代码直接操控。这也就是所谓“控制反转”的概念所在。控制权由应用代码中转到了外部容器&#xff0c;控制权的转移是所谓反转。IoC还有另外一个名字——“依赖注入…