Java: "Could not reserve enough space for object heap" 错误,尽管有足够的内存
Java: "Could not reserve enough space for object heap" error, despite enough memory
当运行使用如下命令时:
$ 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 位地址 space,这 远 更有可能发生(如果您使用的是 32 位 OS或 32 位 JVM),但无论如何仍然会发生。
当运行使用如下命令时:
$ 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 位地址 space,这 远 更有可能发生(如果您使用的是 32 位 OS或 32 位 JVM),但无论如何仍然会发生。