これは64ビットWindows 7 Enterprise
および64ビットのJava7です。
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ビットバージョンだと思っていた)と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
さらに増加したままになるまで続きました。
何が起こっているのでしょうか?(64ビットのものでも)何かを起動すると、cmd.exe
プロセスサイズに制限がありますか?Windows(またはJVM)は単一の巨大なメモリブロックを必要としますか?(しかし、なぜ異なるメッセージ)?他に何かありますか?