ChatGPT解决这个技术问题 Extra ChatGPT

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

每次尝试运行程序时,我都会反复收到以下异常。

VM 初始化期间发生错误无法为对象堆保留足够的空间无法创建 Java 虚拟机。

我试图增加我的虚拟内存(页面大小)和 RAM 大小,但无济于事。

我怎样才能消除这个错误?

在我的虚拟机上使用 jdk/jre 1.6 时,我也收到此错误,尝试更改注释中给出的配置值,但这没有帮助,更新到 jdk 1.7 后,错误消失并应用了更大的 Xmx 参数。自 java 1.6 以来,堆使用似乎有很多变化。

H
Hearen

使用 -XX:MaxHeapSize=512m(或您需要的任何大数字)(或简称为 -Xmx512m)运行 JVM


或者更短的 -mx256m 或 -mx512m ;)
-mx 是否与 -Xmx 和 -XX:MaxHeapSize 相同?
谢谢..原来太大的数字也可能是一个问题,并且会给出同样的错误!
任何人都找到了一个实际 100% 有效的解决方案?此解决方案暂时解决了问题,但突然又回来了。我有 16GB 的内存,我厌倦了这个狗屎。过去一切都更好:[
在带有 x86 或 x64 Java 的 Windows 8 上不适用于我。
d
djangofan

这也可能是由于在 32 位 HotSpot 虚拟机上设置过大而导致的,例如:

-Xms1536m -Xmx1536m

这可能/会起作用的地方:

-Xms1336m -Xmx1336m

我忘了提到在 32 位命令 shell 中启动时会出现这个问题。 64 位命令外壳可能没有这个问题。
对我来说,默认值和值太大而失败,因此请确保尝试多个值。感谢你的回答!
好的提示是,当其设置为高于可用值时它会失败。对我来说它失败了,因为它设置为 5G 并且它在一个小实例上运行,减少到 512 似乎效果更好
H
Hearen

这是解决方法:

转到开始->控制面板->系统->高级(选项卡)->环境变量->系统变量->新建:变量名:_JAVA_OPTIONS 变量值:-Xmx512M 变量名:路径变量值:%PATH%;C: \Program Files\Java\jre6\bin;F:\JDK\bin;

将此更改为您的适当路径。


this answer 非常相似,我想说...
好一个。除了上面提到的这个也。 stackoverflow.com/a/9350506/967638
J
Jens Timmerman

我在使用 javac 时遇到了这个问题,它似乎并没有在命令行选项上使用,

-bash-3.2$ javac -Xmx256M HelloWorldApp.java 
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

所以这里的解决方案就是这样设置_JAVA_OPTIONS

-bash-3.2$ export _JAVA_OPTIONS="-Xmx256M"
-bash-3.2$ javac HelloWorldApp.java 
Picked up _JAVA_OPTIONS: -Xmx256M

这编译得很好。

这发生在具有大量 RAM 但内存 ulimit 较低的机器上。 Java 决定分配一个大堆,因为它检测到机器中的 ram,但由于 ulimit,它不允许分配它。


+1 指出 _JAVA_OPTIONS — 在我的情况下,java 是从我没有写入权限的 shell 脚本深处的某个地方调用的,所以这个选项更可取。
同样在这里。我正在使用大学计算机,所以我不是管理员(无法更改环境变量),命令行选项根本不起作用。非常感谢!
H
Hearen

32 位 Java 需要内存中连续的可用空间才能运行。如果您指定较大的堆大小,那么即使您有比必要更多的可用空间,内存中也可能没有那么多连续的可用空间。

在这些情况下,安装 64 位版本的 Java 会有所帮助,连续内存要求仅适用于 32 位 Java。


我认为这是最好的答案,以防您在使用 -Xmx[bignumber]m 选项后不断收到错误消息。帮助我正确运行 Apache jMeter。
我创建了一个全新的项目,除了自动生成的主要活动之外没有其他代码,它产生了这个错误
我第二个@RuudvK。安装 64 位允许我在清除内存分配错误的同时增加最大内存。这应该是公认的答案。
A
Axl

结合 -Xmx512M 使用 -d64 以确保您运行的是 64 位 VM。在 64 位机器上,我确信我正在运行 64 位虚拟机,但没有。安装 64 位 Java 后,-d64 选项有效,-Xmx 允许更大的内存大小。

java -d64 -Xmx512M mypackage.Test

这个答案应该在顶部。花了两个月来解决这个问题,才意识到安装 64 位 Java 解决了这个问题(在我的情况下,-d64 选项不是必需的)
拿起_JAVA_OPTIONS:-d64 -Xmx1024M 无法识别的选项:-d64 JVM 无法启动。最大堆大小 (-Xmx) 可能太大,或者防病毒或防火墙工具可能会阻止执行。
l
live-love

在 android 文件夹中打开 gradle.properties 文件。

替换这一行:

org.gradle.jvmargs=-Xmx1536M

和:

org.gradle.jvmargs=-Xmx512m

说明:来自 Gradle 文档的最大限制:

如果请求的构建环境未指定最大堆大小,则守护程序将使用最多 512MB 的堆。


完美!此解决方案适用于以下配置:版本:1.55.2(系统设置)提交:3c4e3df9e89829dce27b7b5c24508306b151f30d 日期:2021-04-13T09:35:57.887Z 电子:11.3.0 Chrome:87.0.4280.1818.js:12。 V8:8.7.220.31-electron.0 操作系统:Windows_NT x64 10.0.19042
我一头雾水,换成512m的大小居然比原来的1536M还小吧?较小的尺寸如何增加最大限制?它对我也不起作用。
e
eduherminio

我遇到了同样的错误,并通过在 run.conf.bat 中配置它来解决这个问题

在 Jboss5x 中使用配置 run.conf.bat 运行 JVM

如果您在语句中传递的空闲内存不可用,那么请在 run.conf.bat 中进行更改

set "JAVA_OPTS=-Xms512m -Xmx512m -XX:MaxPermSize=256m"

H
Hearen

我有类似的问题。我在 64 位机器上安装了 32 位版本的 Java。

通过卸载该版本并安装 64 位版本的 Java。我能够解决这个问题。


H
Hearen

我知道这里已经有很多答案,但没有一个对我有帮助。最后我打开文件 /etc/elasticsearch/jvm.options 并更改:

-Xms2G
-Xmx2G

-Xms256M
-Xmx256M

这为我解决了它。希望这可以帮助这里的其他人。


S
Sirex

假设您的类在包 mypackage 中称为 Test。像这样运行您的代码:

java -Xmx1024m mypackage.Test

这将为您的代码保留 1024 MB 的堆空间。如果你想要 512 MB,你可以使用:

java -Xmx512m mypackage.Test

1024m512m 等中使用小 m


J
Jon Schneider

有时,此错误表明服务器上的物理内存和交换空间实际上已被充分利用!

我最近在运行 RedHat Enterprise Linux 5.7 和 48 GB RAM 的服务器上看到了这个问题。我发现即使只是跑步

java -version

导致了同样的错误,这表明问题不是我的应用程序所特有的。

跑步

cat /proc/meminfo

报道称,MemFree 和 SwapFree 都分别远低于 MemTotal 和 SwapTotal 值的 1%:

MemTotal:     49300620 kB
MemFree:        146376 kB
...
SwapTotal:     4192956 kB
SwapFree:         1364 kB

停止机器上其他一些正在运行的应用程序会带来一些可用内存数字:

MemTotal:     49300620 kB
MemFree:       2908664 kB
...
SwapTotal:     4192956 kB
SwapFree:      1016052 kB

此时,一个新的 Java 实例可以正常启动,并且我能够运行我的应用程序。

(显然,对我来说,这只是一个临时解决方案;我还有一项未完成的任务,要对该机器上运行的进程进行更彻底的检查,看看是否可以采取一些措施来降低名义内存利用率水平,而无需不得不求助于停止应用程序。)


同样在这里,java -version 失败了,尽管 top 仍然显示了一些空闲 :| (也说在VM初始化期间发生错误有时无法为卡标记阵列保留足够的空间)。修复似乎是运行顶部,查找哪些进程使用的 RAM 最多(VIRT 列),杀死它们 [postgres, appdynamics for me] :|
这可能是由于内存碎片造成的吗?上面的回复提到了连续的可用空间。
P
Prabhakar

错误 :

对于错误,“vm 初始化期间发生错误无法为对象堆 jboss 保留足够的空间”

根本原因 :

如下所述,我们的 JVM 内存分配不正确/不足。

例如 jboss-eap-6.2\bin\standalone.conf 中的 JAVA_OPTS="-Xms1303m -Xmx1303m -XX:MaxPermSize=256m" 或 jboss-eap-6.2\bin 中的 "JAVA_OPTS=-Xms1G -Xmx1G -XX:MaxPermSize=256M" \standalone.conf.bat 只不过是 JVM 内存分配池参数。

解析度 :

增加堆大小。为了增加堆大小,

转到 -> jboss-eap-6.2\bin\standalone.conf.bat 或 jboss-eap-6.2\bin\standalone.conf

更改 ->JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxPermSize=256m" 其中 -Xms 是最小堆大小,-Xmx 是最大堆大小。

通常不建议最小和最大尺寸相同。

如果您从 Eclipse 运行您的应用程序,

双击服务器

选择“打开启动配置”,您将被重定向到“编辑启动配置属性”窗口。

在此窗口中,转到选项卡“(x)=参数”。

在 VM Arguments 中,定义您的堆大小,如下所述

"-Dprogram.name=JBossTools: JBoss EAP 6.1+ 运行时服务器" -server -Xms256m -Xmx512m -XX:MaxPermSize=256m -Dorg.jboss.resolver.warning=true


引用 Oracle Command Line Reference:“为了获得最佳性能,请将 -Xms 设置为与最大堆大小相同的大小,例如:java -Xgcprio:throughput -Xmx:64m -Xms:64m myApp
c
codeDr

我最近遇到了这个问题。我有 3 个以 1024m 或 1280m 堆大小开头的 java 应用程序。 Java正在查看swap中的可用空间,如果没有足够的可用内存,jvm就会退出。

为了解决这个问题,我不得不结束几个分配了大量虚拟内存的程序。

我在带有 64 位 jvm 的 x86-64 linux 上运行。


v
vsingh

我有适量的内存设置,但对我来说,它使用的是 64 位 intellij 和 32 位 jvm。一旦我切换到 64 位 VM,错误就消失了。


这个解决方案对我有用!
h
h--n

如果您正在运行 32 位 JVM,将堆大小更改为更小可能会有所帮助。您可以通过直接将 args 传递给 java 或通过如下环境变量来执行此操作,

java -Xms128M -Xmx512M
JAVA_OPTS="-Xms128M -Xmx512M"

对于 64 位 JVM,较大的堆大小(如 -Xms512M -Xmx1536M)应该可以工作。

对 Java7 运行 java -versionjava -d32java--d64 以检查您正在运行的版本。


C
Community

假设您有足够的可用内存并且正确设置了 JVM 参数,您可能会遇到内存碎片问题。检查Java maximum memory on Windows XP


S
Sudhakar

无论如何,这里是如何修复它:转到开始->控制面板->系统->高级(选项卡)->环境变量->系统变量->新建:变量名:_JAVA_OPTIONS变量值:-Xmx512M

或者

如下所示更改 ant 调用。

   <exec
        **<arg value="-J-Xmx512m" />**
    </exec>

它对我有用。


H
Haris Durrani

初始化 VM 时出错无法为 1572864KB 对象堆保留足够的空间

我将 settings.grade 文件 1536 中的内存值更改为 512 并有所帮助


H
Hearen

转到开始->控制面板->系统->高级(选项卡)->环境变量->系统变量->新建:

Variable name: _JAVA_OPTIONS
Variable value: -Xmx512M

全局设置此项会限制您可以提供给 IntelliJ 的堆大小。
F
Fico

如果您正在运行 java 程序: - 在终端中使用正确的 linux 命令运行程序,它将是 'java -jar myprogram.jar' 并添加 -Xms256m -Xmx512m,例如:'java -jar myprogram.jar Xms256m -Xmx512m'

如果您正在运行 .sh 脚本(linux、mac?)或 .bat 脚本(windows),请打开脚本并查找 java 选项(如果它们存在)并增加内存。

如果以上所有方法都不起作用,请检查您的进程(Windows 上的 ctrl+alt+delete)(linux/mac 上的 ps aux)并终止使用分配内存且对您的操作系统不是必需的进程! => 尝试重新运行您的程序。


M
Mogsdad

在 CASSANDRA_HOME/bin/cassandra.bat 你会发现以下配置

REM JVM Opts we'll use in legacy run or installation
set JAVA_OPTS=-ea^
 -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.3.0.jar"^
 -Xms**2G**^
 -Xmx**2G**^

您可以将 2G 减少到一些较小的数字,例如 1G 甚至更少,它应该可以工作。

如果您在 unix 机器上运行,则相同,请适当更改 .sh 文件。


V
Viswanath Nuggu

我遇到了同样的错误,当我使用 %temp% 删除临时文件并重新启动 Eclipse 时,它得到了解决。


H
Hearen

有时它涉及到

$ sysctl vm.overcommit_memory
vm.overcommit_memory = 2

如果您将其设置为:

$ sysctl vm.overcommit_memory=0

它应该工作。


H
Hearen

将 cassandra bin 目录中 cassandra.bat 文件中的 -Xmx2G 替换为 -Xms512M 或任何更大的内存大小。


M
Michael Dz

就我而言,我无法将 gradle.properties 中的 org.gradle.jvmargs=-Xmx... 增加到 1GB 以上。它不起作用,因为我的机器上安装了两个 Java,一个是 32 位的(Gradle 正在使用这个),另一个是 64 位的。我通过添加指向 64 位 Java 的 JAVA_HOME 环境变量解决了这个问题。


h
hyde

无需做任何事情,只需在 POM 文件中进行更改,如下所示

<configuration>
    <maxmemory>1024M</maxmemory>
</configuration>

谁说过 POM 文件?