预留空间过大的OutOfMemoryError

在分配一个应该很适合我为JVM提供的堆中的数据结构时,为什么会出现OutOfMemoryError? 这是我最近遇到的一个问题。

确实,当查看开发人员要完成的工作并通过-Xmx参数对提供给JVM的堆大小进行三重检查时,似乎确实存在着一些可疑之处。

30分钟后,我们了解了情况并解开了谜团。 但这确实起初并不明显,所以我认为如果我更详细地描述根本问题,可能会节省一天的时间。

与往常一样,理解问题的最佳方法是通过动手实例。 我构建了一个小的综合测试用例:

package eu.plumbr.demo;
class ArraySize {public static void main(String... args) {int[] array = new int[1024*1024*1024];}
}

代码很简单–它要做的就是分配一个包含十亿个元素的数组。 现在,考虑到java int原语需要4个字节,因此人们可能会认为使用6g堆运行代码会很好地运行。 毕竟,这十亿个整数应该只消耗4g内存。 那么为什么执行代码时会看到以下内容?

My Precious:bin me$ java –Xms6g –Xmx6g eu.plumbr.demo.ArraySize
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat eu.plumbr.demo.ArraySize.main(ArraySize.java:6)

在投入更多的堆之前(事实上,使用–Xmx7g ,上面的示例运行得很好),让我们尝试了解为什么我们的期望是错误的。

首先– Java中的int原语确实需要4个字节。 因此,这并不是说我们的JVM实现一夜之间变得疯狂。 而且我可以向您保证,数学运算也是正确的-1024 * 1024 * 1024 int原语确实需要4,294,967,296字节或4 GB。

要了解发生了什么,让我们运行相同的情况,并通过指定–XX:+ PrintGCDetails来打开垃圾收集日志记录

My Precious:bin me$ java –Xms6g -Xmx6g -XX:+PrintGCDetails eu.plumbr.demo.ArraySize-- cut for brevity --Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat eu.plumbr.demo.ArraySize.main(ArraySize.java:6)HeapPSYoungGen      total 1835008K, used 125829K [0x0000000780000000, 0x0000000800000000, 0x0000000800000000)eden space 1572864K, 8% used [0x0000000780000000,0x0000000787ae15a8,0x00000007e0000000)from space 262144K, 0% used [0x00000007e0000000,0x00000007e0000000,0x00000007f0000000)to   space 262144K, 0% used [0x00000007f0000000,0x00000007f0000000,0x0000000800000000)ParOldGen       total 4194304K, used 229K [0x0000000680000000, 0x0000000780000000, 0x0000000780000000)object space 4194304K, 0% used [0x0000000680000000,0x0000000680039608,0x0000000780000000)PSPermGen       total 21504K, used 2589K [0x000000067ae00000, 0x000000067c300000, 0x0000000680000000)object space 21504K, 12% used [0x000000067ae00000,0x000000067b087668,0x000000067c300000)

答案现在正盯着我们的眼睛:即使我们有很多可用的总堆,堆中的单个区域也没有足够大的空间来容纳4g对象。 我们的6g堆分为四个单独的区域,大小如下:

  • 伊甸园15.36亿
  • 生存空间( )每个256M
  • 老一代4,096M

现在,牢记对象分配必须适合单个区域,我们确实可以看到应用程序没有机会–在我们的任何堆区域中都没有足够的空间来容纳此4g分配。

那么–我们现在唯一的希望是进一步增加堆数吗? 即使我们已经提供了将近50%的超额配置–将6g堆交给一个应该适合4g的数据结构? 没那么快-有替代解决方案可用。 您可以设置内存中不同区域的大小。 它并不像人们期望的那样简单明了,而且用户友好,但是对启动配置进行两次小的修改就可以解决问题。 使用两个额外的选项启动相同的代码时:

My Precious:bin me$ java -Xms6g -Xmx6g -XX:NewSize=5g -XX:SurvivorRatio=10 eu.plumbr.demo.ArraySize

然后程序执行其工作,并且不会引发OutOfMemoryError。 在启动中添加-XX:+ PrintGCDetails也会对此进行说明:

HeapPSYoungGen      total 4806144K, used 4369080K [0x00000006c0000000, 0x0000000800000000, 0x0000000800000000)eden space 4369408K, 99% used [0x00000006c0000000,0x00000007caaae228,0x00000007cab00000)from space 436736K, 0% used [0x00000007e5580000,0x00000007e5580000,0x0000000800000000)to   space 436736K, 0% used [0x00000007cab00000,0x00000007cab00000,0x00000007e5580000)ParOldGen       total 1048576K, used 0K [0x0000000680000000, 0x00000006c0000000, 0x00000006c0000000)object space 1048576K, 0% used [0x0000000680000000,0x0000000680000000,0x00000006c0000000)PSPermGen       total 21504K, used 2563K [0x000000067ae00000, 0x000000067c300000, 0x0000000680000000)object space 21504K, 11% used [0x000000067ae00000,0x000000067b080c90,0x000000067c300000)

我们看到,现在的区域大小确实是我们所要求的:

  • 如我们的-XX:NewSize = 5g参数所指定,年轻大小int总数(eden +两个幸存者空间)为5g
  • 如我们用-XX:SurvivorRatio = 10参数指定的,Eden比幸存者大10倍。

请注意,在我们的情况下,两个参数都是必需的。 仅指定-XX:NewSize = 5g仍会以某种方式将其在伊甸园和幸存者之间分割,使得任何区域都无法容纳所需的4g。

希望阅读此说明将为您节省以后的调试时间。 或帮助您避免过度配置资源。

翻译自: https://www.javacodegeeks.com/2014/05/outofmemoryerror-on-overprovisioned-heap.html

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

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

相关文章

查看系统剩余空间

1.剩余空间:df -h 2.追踪最耗费硬盘的文件位置 cd /du -h --max-depth1 | sort -rn 转载于:https://www.cnblogs.com/xiaobiaomei/p/10669159.html

【转】理解POCO

理解POCO(Plain Old CLR Object)先要理解POJO。 1、什么是POJO? POJO的名称有多种,pure old java object 、plain ordinary java object 等。  按照Martin Fowler的解释是“Plain Old Java Object”,从字面上翻译为“纯洁老式的java对象”&#xff0c…

『ExtJS』01 001. ExtJS 4 类的定义

ExtJS 4 类的定义类的定义与类方法的调用 样例代码// Define new class Vehicle under the Cookbook namespaceExt.define(Cookbook.Vehicle, {// class configuration goes hereManufacturer : Aston Martin,Model : Vanquish,getDetails : function() {alert(I am an this…

HashMap底层实现原理及面试问题

①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象…

Neo4j 2.1:传递节点ID与UNWIND

在发布Neo4j 2.1时,我们将具有UNWIND子句,该子句使处理事物集合更加容易。 在我的有关创建邻接矩阵的博客文章中,我们想要显示按字母顺序排列的前5个见面组中有多少人,然后检查其他各组中有多少人。 没有UNWIND子句,…

使用C#調用外部程式或是執行DOS命令

在.NET裡要如何調用外部程式呢?? 在.net裡,提供了Process類,提供我們強大的調用外部工具功能,並透過重新導向輸入與輸出,可以取得執行結果,下面就用一個例子來示範在一個WinForm裡輸入一個Dos命令,然後呼…

flex 学习篇 ---- 导航类容器

导航类容器需要使用<mx:ViewStack />。可以直接从ui设计器中拉控件过去舞台或者手动敲代码。 导航类容器就是相当于创建了一个菜单&#xff0c;然后按每个选项都可以进入到不同的页面。 创建了<mx:ViewStack>之后需要为它指定id号。 <mx:ViewStack id"vi…

SQLiteOpenHelper+ContentProvider的使用

效果图&#xff1a; PetDbHelper package com.example.admin.pets;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import com.example.admin.pets.PetContract.PetEntry;public class PetDb…

[Mac入门] 如果更快的打开程序或文件

今天有位网友问我在Windows下可以用CtrlR快速打开程序/文件夹等&#xff0c;在Mac下有没有相类似的功能&#xff1f;本文将介绍一些我的一般做法。 1.Windows下的CtrlR是什么&#xff1f; 我打算从解释CtrlR开始说起&#xff0c;希望朋友们别嫌烦&#xff5e;。Windows下系统全…

Install Shield制作安装包技巧(SQL篇)

1、检查SQL Server是否安装prototype CheckSQL(); function CheckSQL()BOOL bSuccess;NUMBER nType, nvSize;STRING szVer; STRING szSetupVer, szSetupPath;beginRegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );szSetupPath "SOFTWARE\\Microsoft\\MSSQLServer\\Setup&quo…

ActiveMQ –经纪人网络解释–第4部分

在前面的第3部分中 &#xff0c;我们已经看到ActiveMQ如何帮助将远程使用者与本地使用者区分开来&#xff0c;这有助于确定从消息生产者到使用者的较短路径。 在第4部分中&#xff0c;我们将研究如何在远程代理上负载均衡并发使用者。 让我们考虑一些高级配置&#xff0c;以平…

总结CSS3新特性(选择器篇)

CSS3新增了嗯- -21个选择器,脚本通过控制台在这里运行; ~: p ~ p {color : red;/*此条规则将用于p后边所有的p...就是除了第一个p的所有p,规则同p:not(:nth-of-type(1)),但是权重要低于后者*/} [attribute^value]: 选择该属性以特定值开头的元素 [attribute$value]: 选择该属…

js获取地址栏信息

设置或获取对象指定的文件名或路径。 window.location.pathname例&#xff1a;http://localhost:8086/topic/index?topicId361alert(window.location.pathname); 则输出&#xff1a;/topic/index设置或获取整个 URL 为字符串。window.location.href例&#xff1a;http://local…

在NIO.2中使用文件和目录

在先前的文章中&#xff0c;我讨论了文件和目录的创建&#xff08; 创建文件和目录 &#xff09;以及选择&#xff08; 列出和过滤目录内容 &#xff09;。 采取的最后一个合乎逻辑的步骤是探索我们如何使用它们以及如何使用它们。 这是库的一部分&#xff0c;它经过了重新设计…

工作流的设计,业务流程图的绘制与编辑,工作流软件,工作流源代码组件库,开发平台,开发引擎...

基于业务流程的工作流系统在当前的软件工业中占据着非常重要的部分&#xff0c;开发此类系统, 最困难的部分就是业务流程建模和电子表单的可视化界面部分,这部分界面要求有快速的响应时间, 完善的逻辑关系,以及根据需求不断变化而必须具备的灵活编辑功能. E-Form可视化图形源码…

upload file more than 4MB

http://www.websupergoo.com/abcupload.net-1.htm 转载于:https://www.cnblogs.com/stevengeng/archive/2004/12/30/84274.html

Ajax全接触(1)

Ajax全称&#xff1a;Asynchronous JavaScript and XML(异步的JavaScript和XML) .Ajax不是某种编程语言 是一种在无需重新加载整个网页的情况之下能够更新部分网页的技术。 后面引入XMLHttpRequest对象用于后台和服务器交换数据&#xff0c;可以在不重新加载整个页面的前提下…

关于hibernate字段映射@colunm出现的问题以及jpa驼峰大写转_小写的问题探究

关于hibernate字段映射colunm出现的问题以及jpa驼峰大写转_小写的问题探究2018年04月24日 15:47:26 守望dfdfdf 阅读数&#xff1a;735 标签&#xff1a; colunmhibernate表映射实体类 更多个人分类&#xff1a; 工作 问题编辑版权声明&#xff1a;本文为博主原创文章&#xff…

窗口模版

窗口模版 1. 定义窗口模版的ID 在wgui_categories_defs.h文件中有枚举enum MMI_CATEGORY_ID_LIST 首先要在MMI_CATEGORY_ID_LIST中添加窗口模版的ID&#xff0c;例如&#xff1a; MMI_CATEGORY36_ID 2. 控件坐标和控件数组的定义 CustCoordinates.c (plutommi"…

玩Java 8 – Lambda,路径和文件

我最近需要读取一堆文件&#xff0c;而不是仅仅抓住我和可能是大多数开发人员拥有的旧FileUtils.java&#xff0c;然后从一个项目复制到另一个项目&#xff0c;我决定快速了解其他方法。 是的&#xff0c;我知道有Commons IO和Google IO &#xff0c;我为什么还要打扰&#xf…