Java 爪哇语:;无法为对象堆保留足够的空间;错误,尽管内存足够

Java 爪哇语:;无法为对象堆保留足够的空间;错误,尽管内存足够,java,jvm,javac,Java,Jvm,Javac,运行以下命令时: $ javac -J-Xmx1072M ... 一切正常 使用较大内存运行同一命令时: $ javac -J-Xmx2048M ... 我得到以下错误: Error occurred during initialization of VM Could not reserve enough space for object heap Error: Could not create the Java Virtual Machine. 但是,我不明白为什么,因为当我在windo

运行以下命令时:

$ javac -J-Xmx1072M ...
一切正常

使用较大内存运行同一命令时:

$ javac -J-Xmx2048M ...
我得到以下错误:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
但是,我不明白为什么,因为当我在windows命令提示符下运行
systeminfo
时,我得到以下信息:

Total Physical Memory:     16,315 MB
Available Physical Memory: 6,351 MB
Virtual Memory: Max Size:  32,187 MB
Virtual Memory: Available: 13,666 MB
Virtual Memory: In Use:    18,521 MB
也就是说,我有足够的物理记忆


问题是什么?

JVM不能在任何地方为其对象堆挑选任何旧内存,它必须是连续的;意思是一个连续的、无碎片的空闲内存块。虽然从理论上讲,您可能有足够的可用原始内存来启动具有此堆大小的JVM,但如果它不是连续的,那么就JVM而言,它是无用的


请注意,在使用32位地址空间时(如果您使用的是32位操作系统或32位JVM),这种情况发生的可能性要大得多,但无论如何都可能发生。

64位或32位JVM?谢谢。想知道你在Windows上还剩下多少连续内存吗?@YahyaUddin遗憾的是,我找不到。似乎唯一的方法是编写本机代码来分配和释放各种内存块,直到达到极限。我不明白的是,这与虚拟内存的概念有什么关系。有人能给我解释一下吗?操作系统可能会将JVM的内存页交换到磁盘上,然后再次将它们加载到RAM中——很可能它们会加载到不同的位置,因此进程使用的物理内存不再是连续的。至于进程的虚拟内存,它总是连续的,因为每个进程都有自己的地址空间。还是我遗漏了什么?