オブジェクトへのアクセスには、Java スタック、Java ヒープ、メソッド領域の 3 つのメモリ領域が関係します。
例えば以下のコード:
Object objectRef = new Object();
このコードがメソッド本体にあるとすると、「Object objectRef」の部分がJavaスタックのローカル変数に反映され、参照型のデータとして現れます。 「new Object()」部分は Java ヒープに反映され、オブジェクト型のすべてのインスタンス データ値を格納する構造化メモリを形成します。このメモリの長さは、特定の型と実装されるオブジェクト メモリ レイアウトによって異なります。仮想マシンは修正されていません。さらに、Java ヒープには、このオブジェクト タイプのデータ (オブジェクト タイプ、親クラス、実装されたインターフェイス、メソッドなど) を見つけることができるアドレス情報も含まれている必要があります。これらのデータ タイプはメソッド領域に格納されます。
参照タイプは、Java 仮想マシンの仕様でオブジェクトを指す参照アドレスを規定するだけであり、Java ヒープ内のオブジェクトの場所にアクセスするためにこの参照を配置する方法を定義するものではありません。そのため、異なる仮想マシンが実装されます。アクセス方法はさまざまですが、ハンドルを使用する方法とダイレクト ポインタを使用する方法の 2 つが主流です。访ハンドルアクセス方法
: Java パイルはハンドルプールとしてメモリの一部に分割され、オブジェクトのハンドルアドレスが参照に格納され、ハンドルにはオブジェクトインスタンスデータとタイプの特定のアドレス情報が含まれます。データ型のデータ。
ポインタアクセス方式
: 参照変数にはオブジェクトのアドレスが直接格納され、Java ヒープオブジェクトの一部にはオブジェクトインスタンスデータが格納され、他の部分にはオブジェクトタイプデータが格納されます。
ハンドル アクセス メソッドを使用する最大の利点は、オブジェクトが移動されるときに、インスタンス データ ポインタのみが参照に格納されることです。ハンドルは変更する必要がありますが、リファレンスは変更する必要はありません。ポインタ アクセス方法を使用する最大の利点は、仮想マシンに関する限り、2 番目の方法 (直接ポインタ アクセス) を使用するため、ポインタの位置決めにかかる時間のオーバーヘッドが節約されることです。
関連記事:
Java仮想マシンを詳しく解説