10

これは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.

との違いを分割して2G3Gこれが発生した特定のサイズがあるかどうかを確認しよう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さらに増加し​​たままになるまで続きました。

何が起こっているのでしょうか?(64ビットのものでも)何かを起動すると、cmd.exeプロセスサイズに制限がありますか?Windows(またはJVM)は単一の巨大なメモリブロックを必要としますか?(しかし、なぜ異なるメッセージ)?他に何かありますか?

4

2 に答える 2

5

SysWoW64は32ビットを指しWindows on Windows 64ます。簡略化:Windows 64ビットで実行されている32ビットWindows)。

したがって、32ビットのcmdシェルでの実行を明示的に要求しています。

参照してください:

http://en.wikipedia.org/wiki/WoW64

于 2012-06-04T22:14:02.087 に答える
4

64ビットシステムでは、2 ^ 63バイトのユーザーアドレス空間がありますが、マップできるのは実際のメモリの量(物理+ページファイル+マップされたファイル)のみです。

JVMがヒープを作成するとき、JVMはCを使用してmalloc()メモリの初期チャンクを要求し、次にそれ自体でチャンクを管理します。ヒープ上にオブジェクトがまったくない場合でも、OSに対してチャンクが使用されています。

メモリプールの最小値であるを指定-Xmsしたため、JVMは単にOSにその量のメモリを要求しようとするか、コマンドを満たせないために失敗します。

64ビットJavaの利点を見たいのなら、私は推測します。たぶん、ランダムアクセスのために4GBより大きいファイルを開いて、それをMappedByteBufferにマップしてみることができます。

于 2012-06-05T00:27:20.653 に答える