Не удается запустить 64-разрядную JVM в 64-разрядной Windows 7 с большим размером кучи

Это 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, и это сработало. С -Xms2970mJVM потерпела крах:

#
# 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) один огромный блок памяти? (Но тогда почему разные сообщения)? Что-то еще?

10
задан QuantumMechanic 4 June 2012 в 23:09
поделиться