1. ホーム
  2. java

Java Constant Poolの目的は何ですか?

2023-07-24 05:50:30

質問

現在、Java仮想マシンの仕様について深く掘り下げようとしています。私が読んでいるのは オンライン版Inside the JVMブック を読んでいますが、私が理解できない混乱した抽象化が1つあります。以下は、この本からの抜粋です。

ロードする各型について、Java 仮想マシンは定数プールを保存する必要があります。定数プールは、リテラル(文字列、整数、浮動小数点定数)、型、フィールド、メソッドへのシンボリック参照を含む、型によって使用される定数の順序付きセットです。定数プールのエントリは、配列の要素のようにインデックスで参照されます。定数プールは、型によって使用されるすべての型、フィールド、およびメソッドへのシンボリック参照を保持するため、Javaプログラムの動的リンクにおいて中心的な役割を果たします。

上記と一般的なCPについて、いくつか質問があります。

  1. CP は .class ファイルにありますか?
  2. 著者は、"シンボリック参照" をどのように意味するのですか?
  3. コンスタント・プールの目的は何ですか?

どのように解決するのですか?

フレームがどのように構成されているのか、図を使って理解することが有効だと思います。

フレームはオペランド(演算命令)が存在する場所であり、そこでダイナミックリンクが行われます。 いわば、クラスとそのメンバを追跡するために定数プールを使用する省略記法です。

各フレームはランタイム定数プールへの参照を含んでいます。この参照は、そのフレームで実行されるメソッドのクラスの定数プールを指しています。この参照はダイナミックリンクのサポートに役立ちます。

C/C++ コードは通常、オブジェクト ファイルにコンパイルされ、複数のオブジェクト ファイルがリンクされて、実行可能ファイルや dll などの使用可能なアーティファクトが作成されます。リンクの段階で、各オブジェクト ファイル内の記号参照は、最終的な実行ファイルに対する実際のメモリ アドレスに置き換えられます。Java では、このリンク段階は実行時に動的に行われます。

Java ファイルがコンパイルされるとき、変数とメソッドへのすべての参照は、シンボリック参照としてクラスの定数プールに格納されます。シンボリック参照は論理的な参照であり、実際に物理的なメモリロケーションを指す参照ではありません。

以下は James Blooms JVM インターナルズ を参照してください。