他の回答が説明するようにJavaのメモリは2つの部分に分かれています
1.スタック:スレッドごとに1つのスタックが作成され、スタックフレームを格納します。スタックフレームはローカル変数を格納し、変数が参照型の場合、その変数は実際のオブジェクトのヒープ内のメモリ位置を参照します。
2.ヒープ:すべての種類のオブジェクトはヒープのみで作成されます。
ヒープメモリは再び3つの部分に分かれています
1.ヤングジェネレーション:寿命の短いオブジェクトを保存します。ヤングジェネレーション自体は、エデンスペースとサバイバースペースの 2つのカテゴリに分類できます。
2. Old Generation:多くのガベージコレクションサイクルを生き延び、まだ参照されているオブジェクトを格納します。
3.永続的な生成:ランタイム定数プールなど、プログラムに関するメタデータを保存します。
文字列定数プールは、ヒープメモリの永続的な生成領域に属しています。
javap -verbose class_name
メソッドの参照(#Methodref)、クラスオブジェクト(#Class)、文字列リテラル(#String)を表示することで、バイトコード内のコードのランタイム定数プールを確認できます。
詳細については、私の記事「JVMによるメソッドのオーバーロードとオーバーライドの内部処理」を参照してください。