1

例を挙げましょう。

public class test {
  public static void main(String args[]) {
    int a=5,b=4;
    int c=a+b;
    int d=9;
    System.out.println("ANSWER PLEASE..");
  }
}

このコードを実行すると、os は何をするのでしょうか?

最初に という名前の変数を作成し、およびaと同様のメモリ アドレスを割り当てます。bc

さてどうなるかdcos は新しいメモリアドレスを作成するか、値が同じであるためのアドレスを参照するだけです。

4

2 に答える 2

3

まず、コンパイラはあまり機能しません。基本的に、クラスファイル/バイトコードに変換します。バイトコードには、メソッドを実行するために必要なローカル変数の数を示す「max locals」と呼ばれる数値があります。

一方、この情報を読み取ってコードを実行する JVM は、必要な変数に合わせてメモリがスタック フレームに割り当てられるようにします要求する量は実装に大きく依存し、全体を最適化し、コードで示されているよりも少ないバイトを割り当てる可能性があります。

于 2012-08-01T06:47:49.510 に答える
0

d はどうなりますか。os は新しいメモリアドレスを作成するか、値が同じであるため c のアドレスを参照するだけです。

  • これは Java とタグ付けされています。だから、OSをそこから遠ざけましょう。すべては、事前に大きなチャンクで割り当てられている JVM によって管理されるメモリ内で発生します。
  • あなたはプリミティブデータ型について話している。それらは、他の場所にあるオブジェクトへの参照としてではなく、値によって格納されるため、簡単です。
  • あなたはローカル変数について話している。これらは、実行中のスレッドのコール スタック (ヒープ メモリではなく) に割り当てられます。ここでもプリミティブなので、ヒープはまったく関係ありません。
  • あなたの場合、4つの整数に対して(スタック上に)割り当てられたメモリがあります。それらのそれぞれには、参照ではなく、それに割り当てられた値が含まれています。すべてに同じ値が割り当てられていても、それらは別々に存在します。メソッドが戻ると、メモリは「解放」されます (実際には解放されませんが、スレッドによって使用されなくなります)。
  • それらが整数ではなくオブジェクトの場合、(ヒープ上のオブジェクトへの) 「ポインターを共有」できますが、整数は値 (それぞれ 4 バイト) で格納されます。
于 2012-08-01T07:14:32.413 に答える