无法为对象堆保留足够的空间

时间:2020-02-23 14:34:02  来源:igfitidea点击:

Could not reserve enough space for object heap

在本教程中,我们将看到一个错误( Could not reserve enough space for object heap),在处理JVM时可能会遇到。
我们将看到我们如何解决这个问题。
当Java进程由于内存限制而无法创建Java虚拟机时,通常会引发此错误。

在我们经过此问题的原因和修复之前,让我们通过一些基本的东西。

堆大小

堆大小是用于在运行时存储Java对象的内存分配空间。
此堆大小可具有最小值和最大堆大小。
我们可以使用XMX和XMS VM参数指定最小和最大大小。

最大堆大小

最大可能的堆大小可以通过可用的存储空间确定。
它在32位和64位不同如下。

  • 32位JVM的2 ^ 32(~4GB)
  • 64位JVM上的2 ^ 64(~16EB)。

通常,32位Windows将在32位窗口上获得1.4-1.6 GB,32位Linux上大约3GB。

如果我们需要大堆,那么我们通常应该使用64位JVM。

原因1:没有指定堆大小

假设我们在不指定任何堆大小的情况下运行Java程序,并且我们将在以下错误。

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
You will get this error more often in 32 bit JVM rather than 64-bit JVM

原因32位Java需要内存中的连续可用空间运行。
如果我们指定了大量堆大小,即使空间超过必要,也可能在内存中可能没有那么多连续的可用空间。
安装64位版本可能在这种情况下解决此问题。

修复1

我们可以通过运行java以较低的堆大小(如-xmx512m)来解决此错误。

java -Xmx512M MyApplication

原因2:XMX值过大

如果在32位VM上使用-xmx选项指定过大的内存,则可能会收到此错误。
例如:假设我们正在下面执行错误。

java -Xms1536M -Xmx1536M MyApplication

修复2.

我们可能没有足够的易用空间内存。
我们可以使用略低堆大小运行应用程序来解决问题。

java-Xms1336M -Xmx1336M MyApplication

原因3:指定比物理内存更多的大堆大小

如果指定64位或者32位计算机上可用的物理内存的大量堆大小,则会收到此错误。
例如:假设计算机上有3 GB 内存,并且我们正在执行以下命令,我们将收到此错误。

java -Xms4096M -Xmx4096M MyApplication

修复3.

我们可以使用堆大小运行应用程序,该应用程序小于物理内存。

java-Xms2048M -Xmx2048M MyApplication

有时以上解决方案可能无法正常工作。

设置_java_options环境变量

所以你可以设置 _JAVA_OPTIONS作为环境变量。

在Linux中

-bash-3.2 $export _java_options =" - xmx512m"-bash-3.2 $javac myapp.java

在Windows中

转到开始 - >控制面板 - >系统 - >高级(标签) - >环境变量 - >系统变量 - >新:变量名称: _JAVA_OPTIONS变量值:-xmx512m

从Java 9+开始,JDK_JAVA_OPTIONS是首选的环境变量,用于指定Java选项。 在低于Java 9的版本中,它将被忽略。

对于2097152KB对象堆来不能保留足够的空间

我们可能会收到特定错误 Could not reserve enough space for 2097152kb object heap如果我们使用的任何工具。
这简单意味着JVM无法获取默认情况下该工具所需的2 GB堆空间。

Apache Cordova.

Apache Cordova是最初由Nitobi创建的移动应用程序开发框架。
如果我们在Apache Cordova上收到此错误,则此处是解决方案。

  • 从32位JVM切换到64位JVM
  • 设置_java_options环境变量 -Xmx512M
  • 修改
args.push('-Dorg.gradle.jvmargs=-Xmx2048m') 
 to  
args.push('-Dorg.gradle.jvmargs=-Xmx1024m');

在机器上的以下文件上。
项目文件夹\平台\ android \ cordova \ lib \ builders \ builders.js项目 - 文件夹\ platforms \ android \ cordova \ lib \ builders \ gradlebuilder.js项目 - 文件夹\ platforms \ android \ cordova \ lib \ builders \ studiobuilder。 JS.

JFROG ARICATTORY.

如果我们使用JFROM Artifactory作为工件生命周期管理工具和获取 Could not reserve enough space for 2097152kb object heap在推出它时。
转到jfrog artifactory安装的bin目录,按照以下行更改 arifactory.bat文件。

set JAVA_OPTIONS=-server -Xms512m -Xmx2g -Xss256k -XX:+UseG1GC
to
set JAVA_OPTIONS=-server -Xms512m -Xmx1024m -Xss256k -XX:+UseG1GC

这应该解决JFrog artifactory安装的此错误。

总结

  • 如果我们可以在64位机器中安装32位JVM。

卸载该版本并安装64位版本的Java

  • 我们可能提供了太大的堆大小,可能大于物理内存。在这种情况下,我们需要减少JVM的堆大小。
  • 如果上述解决方案不起作用,则可以设置 JAVA_OPTS作为环境变量来解决这个问题。如果你设置了 JAVA_OPTS环境变量,然后每个JVM初始化将自动使用此环境变量的配置