7

これはおそらく尋ねる必要さえありませんが、私はこれについて正しいことを確認したいと思います. Java で任意のオブジェクトの配列を次のように作成する場合:

Object[] objArr = new Object[10];

変数objArrはスタック メモリ内にあり、配列オブジェクトが配置されているヒープ内の場所を指します。ヒープ内のその配列のサイズは、12 バイトのオブジェクト ヘッダー + 4 (参照サイズによっては 8) バイト * 配列内のエントリ数に等しくなります。これは正確ですか?

それでは、私の質問は次のとおりです。上記の配列は空なので、そのコード行の実行直後にヒープ内で 12 + 4*10 = 52 バイトのメモリを占有しますか? それとも、JVM はインスタンス化する前に配列に何かを入れ始めるまで待機しますか? 配列内のヌル参照はスペースを占有しますか?

4

2 に答える 2

7

null 参照は「スペースを占有」します。配列のメモリは 1 つのチャンクで事前に割り当てられ、ゼロに設定されます (すべての内容を null 参照にするため)。演習として、JVM のメモリ制限よりも多くのスペースを占有する巨大な配列を割り当ててみてください。プログラムはすぐにメモリ不足エラーで終了するはずです。

于 2012-11-13T04:56:40.870 に答える
2

これはあなたに役立つと思います

public static void main(String[] args) {
        Runtime r = Runtime.getRuntime();
        System.gc();
        System.out.println("Before " + r.freeMemory());
        Object[] objArr = new Object[10];
        System.out.println("After " + r.freeMemory());
        objArr[0] = new Integer(3);
        System.gc();
        System.out.println("After Integer Assigned " + r.freeMemory());
    }

出力

Before 15996360
After 15996360
After Integer Assigned 16087144
于 2012-11-13T05:05:27.617 に答える