Jvm

Javaのメモリ内の配列の図



Diagram Array Memory Java



1.Javaメモリ分割

Javaメモリは、家を分割するようなもので、キッチン、リビングルーム、ベッドルームに分割されます。分割された各エリアは、独自の役割を果たします。 Javaのメモリは5つの部分に分かれています。
1.スタック

  • メソッド内のローカル変数が格納されます。
  • メソッドの実行はスタック内にある必要があります。
  • ローカル変数:メソッドパラメーター、またはメソッド{}内の変数。
  • ローカル変数の特性:スコープがあり、スコープを超えるとすぐにスタックから消えます。

2.ヒープ



  • 新しいものはすべてヒープ内に出てきます。
  • ヒープメモリ内のすべてに16進アドレス値があります。
  • ヒープメモリに保存されているデータにはデフォルト値があります
    -整数のデフォルト値は0です。
    -浮動小数点数のデフォルト値は0.0です。
    -文字のデフォルト値 ' u0000'
    -ブール値のデフォルト値はfalseです
    -参照型のデフォルト値はnullです

3.メソッドエリア

  • メソッド情報を含む.class関連のメソッドを格納します。
  • 静的データを格納する静的領域があります

4.メソッド領域(ネイティブメソッドスタック)



  • オペレーティングシステム関連情報

5.レジスタ(pcレジスタ)

  • CPU関連情報

2.配列のメモリマップ

配列のメモリマップ:
画像
次のように進めます
1.1。 .classファイルでmainメソッドを見つけ、mainメソッドのヘッダーをメソッド領域にロードします。
二。 メソッド領域でmainメソッドの関連情報を見つけ、mainメソッドの関連情報をスタックにロードし(メソッドはスタックで実行されます)、mainメソッドのスタック内の領域を開きます。 -スタックに
3.3。 int [] array = new int [3]配列を作成します
int [] array:最初にローカル変数int []配列を開いた領域に置きます。
new int [3]:新しいものはヒープ内にあり、配列を配置するための領域がヒープ内に開かれ、3つの小さなグリッドに分割されます。配列に格納されているものはすべてデフォルト値である必要があります。 int型のデフォルト値は0です。配列には16進アドレス値(0x666)が必要です。このアドレス値は、int []配列の後ろにコピーされます。このアドレス値を使用して、ヒープ内の配列を見つけることができます。
四。 System.out.println(array)アドレス値を出力します。
5.5。 System.out.println(array [0])最初に、配列を介してヒープ内の配列のアドレス値(0x666)を検索し、アドレス値を介してヒープ内の配列の位置を検索し、次にアドレス値を介して値を検索します。インデックス。
6.6。 array [1] = 10最初に値を見つけ(ステップ5と同じ)、次にそれを変更します。

2つの独立したアレイのメモリマップ: 配列の作成プロセスを2回実行するだけで、言うことは何もありません。
画像
同じ配列のメモリマップへの2つの参照: 特別な場所はスタック内です。int[] arrayAアドレス値をint [] arrayBにコピーしました。arrayB[1] = 10ステップ、最初にint [] arrayBを実行します。アドレス値の後、配列内の配列の位置を見つけます。ヒープを作成し、インデックスから値の位置を見つけて、値を変更します。
画像