Это 64-разрядная Windows 7 Корпоративная
и 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)
Это происходит с помощью оболочки обоих C:\Windows\SystemWOW64\cmd.exe
(который я ошибочно считал 64-разрядной версией) и с 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-битной Java на 64-битной Windows я мог бы использовать практически любой размер максимального и начального размера, который я хотел, но это не то, что происходит.
java -Xmx16G -Xms2G Trivial
(например) работает нормально. Однако java -Xmx16G -Xms4G Trivial
дает мне:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Weirder (для меня), 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) один огромный блок памяти? (Но тогда почему разные сообщения)? Что-то еще?