这是 64 位Windows 7 Enterprise
和 64 位 Java 7:
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)
这发生在使用两者的 shell C:\Windows\SystemWOW64\cmd.exe
(我错误地认为是 64 位版本)和with C:\Windows\System32\cmd.exe
(我刚刚发现,由 Pulsar 提供,是一个 64 位应用程序,尽管有路径名)。
程序本身很简单:
public class Trivial
{
public static void main(String[] args) {
System.out.println("total = " + toMB(Runtime.getRuntime().totalMemory()));
System.out.println("max = " + toMB(Runtime.getRuntime().maxMemory()));
}
private static long toMB(long bytes) {
return bytes / (1024L * 1024L);
}
}
我只是在玩弄不同-Xmx
的-Xms
论点,看看会发生什么。虽然我会在 64 位 Windows 上使用 64 位 Java,但我几乎可以使用任何我想要的最大大小和初始堆,但这不是正在发生的事情。
java -Xmx16G -Xms2G Trivial
(例如)工作正常。但是,java -Xmx16G -Xms4G Trivial
给了我:
Error occurred during initialization of VM
Could not reserve enough space for object heap
更奇怪(对我来说),java -Xmx16G -Xms3G Trivial
给出了一个不同的错误:
Error occurred during initialization of VM
Unable to allocate tables for parallel garbage collection for the requested heap size.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
试图区分两者之间的差异2G
并3G
查看是否存在发生这种情况的特定大小,我尝试过java -Xmx16G -Xms2900M Trivial
并且它有效。然后我尝试-Xms2960M
了,它奏效了。随着-Xms2970m
JVM崩溃:
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 1048576 bytes for E in C:\jdk7u2_64p\jdk7u4\hotspot\src\share\vm\utilities/taskqueue.hpp
# An error report file with more information is saved as:
# C:\Users\QuantumMechanic\Temp\hs_err_pid10780.log
这种情况一直持续到-Xms2995M
它切换回“无法为并行垃圾收集分配表”消息并坚持下去,因为它-Xms
进一步增加了。
会发生什么?从cmd.exe
(甚至是 64 位)启动某些东西是否会施加一些进程大小限制?Windows(或 JVM)是否需要一个巨大的内存块?(但是为什么会有不同的消息)?还有什么?