运行java -version时出现“无法为对象堆保留足够的空间”的错误。

5

我知道这是一个常见的问题/难题。我想知道从哪里开始解决这个问题。

在Windows Server 2008上运行Java,我们有65GB的内存,显示25GB是空闲的。(目前有几个人正在运行进程)。

systeminfo | grep -i memory

显示:

总物理内存:65536 MB
可用物理内存:26512 MB
虚拟内存:最大大小为69630 MB
虚拟内存:可用299 MB
虚拟内存:已使用69331 MB。

我只是想知道如何解决这个问题。

  • 我应该从哪里开始?
  • 更多的虚拟内存被使用而不是物理内存是什么意思,这是导致Java无法启动的原因吗?
  • Java是否想要使用虚拟内存而不是物理内存?

java-version

给了我以下错误信息:

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

更具体的问题:

  • JVM为什么不想使用可用的物理内存?
  • 如果不指定Xms参数,Java命令(如java-version)要使用多少内存?
  • 是否只分配更多的虚拟内存是解决问题的好方法?

你使用的是64位虚拟机还是32位虚拟机? - Louis Wasserman
可能是重复问题:https://dev59.com/U2ox5IYBdhLWcg3wSCfk - Christian Garbin
使用 java -Xms64m -Xmx64m -version 命令,我得到了以下输出: java version "1.7.0_07" SE Runtime envrionment <build 1.7.0_07-b10> Java HotSpot 64-bit server VM (build 23.3-b01, mixed mode) - dwjohnston
上面的-Xms64m是您的初始堆设置。如果超过可用内存,就会出现您描述的错误。我不确定详细情况,但我认为内存也必须是连续的。 - Ryan Stewart
我有一个问题,为什么Java不想使用可用的物理内存呢?例如,目前显示有29GB可用的物理内存和8GB可用的虚拟内存。java -Xms4g -Xmx4g -version可以工作,但是java -Xms16g -Xmx16g -version会给我空间错误。为什么它不使用那个物理内存呢? - dwjohnston
显示剩余3条评论
3个回答

2

我遇到了同样的问题。经过分析,我们发现机器的交换空间很低。请增加交换空间并验证。


0

当我遇到类似的问题时(尽管系统上的内存要少得多--请参见无法在64位Windows 7中使用大堆大小运行64位JVM),我发现在Windows上,JVM将尝试分配连续的内存块。

因此,我的猜测是,虽然您拥有足够的内存,但您没有足够的连续内存。


如果内存不是连续的,这有什么关系吗? 是否可能告诉Java不要寻找连续的内存? - dwjohnston
2
这很重要,因为这是JVM想要的。它试图全或无地分配内存。请参见https://dev59.com/M3VC5IYBdhLWcg3w1E1q#497961,例如JVM为什么想要连续的内存(这也意味着没有办法告诉它不需要)。 - QuantumMechanic
1
好的,那么我该怎么做才能确保内存是连续的呢?系统中有很多内存。此外,我认为在虚拟内存计算机中,程序会被呈现出一个虚拟连续的内存块,程序不需要知道(或关心)真实内存是否连续。 - Ryan

0

至少要查看Java版本运行 java -Xmx64m -version 如果需要,这应该会显示您的版本。然后您可以尝试增加Xmx并查看它失败的值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接