3

Java では、ローカル変数に最大 32 ビットのメモリ空間が割り当てられますか? そうである場合、Java コードのメソッドでデータ型 long (64 ビット) のローカル変数を使用するとどうなりますか? この変数にはどのようにメモリが割り当てられますか?

私が答えを得るためにグーグルで検索したときはいつでも、Javaメモリ領域にのみ関連する説明を得ました。これは、ローカル変数がメモリを取得する場所を説明しました(スタック内の関連するメソッドのフレームで..これはわかっています)。私の質問への応答。

4

2 に答える 2

2

JVM は通常、スタック上のローカル変数をワード アラインします。つまり、32 ビット JVM では 32 ビットを使用し ( 64 ビットを使用するlongs とdoubles を除く)、64 ビットでは 64 ビットを使用します。 JVM。JVM は、変数が占有するスペースが少なくなるように変数をパックすることができます (たとえば、4 つの単語を 4 つの別々の単語にbyte入れるのではなく、32 ビットの単語に4 つの単語を入れる)。byteプロセッサは、それらを使用する前にそれらを解凍する必要があります。

于 2013-07-29T20:36:40.610 に答える
2

元の VM 仕様は、実際にはローカル変数に関してめちゃくちゃです。各ローカル変数はスタック上の「スロット」(単にインデックス番号) に予約され、各スロットは 4 バイトを保持することになっています。したがって、各変数は 1 つの「スロット」にマップされます。ただし、4 バイト (double、long) を超える変数は、 2 つの連続するスロットを占有する必要があります。ただし、参照は1 つのスロットを占有しますが、64 ビット VM では 8 バイトになる場合があります。これが指定された時点では 64 ビット VM は存在しなかったため、仕様では 32 ビット参照が想定されていました。

実際には、現在のすべての VM が適切と思われるスタック スロットを再マップし、スタックで予約される実際のサイズも VM によって決定されると確信しています。したがって、残っているのは、バイトコード内の独特のスロット割り当てスキームだけです。実際の「スロット」はすべて、純粋にバイトコード レベルにあります。VM は、バイトコードで指定されたスロット レイアウトに物理的に準拠する必要はありません。

バイトコード仕様を調べてください: http://docs.oracle.com/javase/specs/jvms/se5.0/html/Overview.doc.html#17257

于 2013-07-30T10:33:58.890 に答える