1

次のような main メソッドを含む Main クラスを作成します。

public class Main {

    public static void main(String[] _args) {
    System.out.println("free:" + Runtime.getRuntime().freeMemory()
        + ". max:" + Runtime.getRuntime().maxMemory());
    }
}

次に、-Xms2m と -Xmx2m を指定してクラスを実行します。出力は次のようになります。

free:2984840. max:7471104

次に、私の質問は、1 メガバイトが 1048576 バイトの場合、表示される空きメモリは -Xms で設定された 2 メガバイトではありません。-Xms オプションを 3m に増やすと、メガバイトの追加が無料であることが示されます。誰でも何が起こっているのか説明できます..?

-Xmx オプションを使用すると別のケースが発生します。オプションを 3m、4m、および 5m に増やすと、最大値は 7471104 を示し続けます。これは約 71.44m です。この 2 つのオプションがどのように機能するのか、よくわかりません。

これは、-Xms3m と -Xmx6m を設定したときに出力されるものです

free:4033416. max:7471104

誰でも助けることができます.?

ありがとうございました :)

注: 私は Win7 x64 と Java 1.6 update 35 で作業しています。

4

2 に答える 2

1

JVM には、明らかではないメモリの割り当て方法に関する制限があります。これは、与えられたサイズのみをヒントとして取り、可能な限り厳密に従うことを意味します。非常に小さいメモリ サイズの場合、これらの違いはより劇的ですが、20 GB を要求しても、正確に 20 GB でバイトになるわけではありません。

于 2013-02-03T08:52:16.663 に答える
0

ヒープには、アプリケーションによって割り当てられたデータだけでなく、VMによって割り当てられたオブジェクト(クラスを表すオブジェクトなど)も含まれます。ホットスポットVMのフットプリントは、最大ヒープサイズとして設定したものよりも明らかに大きくなります。これが、実際のヒープサイズが大きい理由です。

于 2013-02-03T09:01:26.097 に答える