インスタンスフィールド(プロパティバッキングフィールドを含む)は、NオブジェクトのNコピーを取得します。
静的フィールドは、クラスごとに1つのコピーを取得します。
メソッドは、プログラム「イメージ」または実行可能コードセグメントの一部であるバイトコードのブロック(またはJITの後、ネイティブ命令のブロック)です。メソッドは、ディスク上にあるプログラムイメージの一部です。OS(またはCLR)によってイメージがロードされると、メソッドコードの共有コピーが1つあります。
ホスト可能なコンパイラを使用して新しいメソッドをオンザフライでコンパイルできる場合を除き、これらは一般に「ヒープ」またはランタイム割り当ての一部ではありません。メソッドはオブジェクトのように「割り当て」られず、オブジェクトの作成に関連して「割り当て」られません。これらは、単一のオブジェクトがインスタンス化される前のプログラムの一部としてのみ存在します。ラムダ/デリゲートでさえ、その場で割り当てられません。コンパイラは、これらの動的に見える他のコードオブジェクトを実装するためにクラスをオンデマンドで作成し、ディスク上のバイトコードイメージの一部としても存在します。
コメントごとの更新:
JVM標準には、次のように記述されています。
2.5.4。メソッドエリア
Java仮想マシンには、すべてのJava仮想マシンスレッド間で共有されるメソッド領域があります。メソッド領域は、従来の言語のコンパイルされたコードの記憶領域に類似しているか、オペレーティングシステムプロセスの「テキスト」セグメントに類似しています。ランタイム定数プール、フィールドおよびメソッドデータなどのクラスごとの構造、およびクラスとインスタンスの初期化とインターフェイスの初期化で使用される特別なメソッド(§2.9)を含むメソッドとコンストラクターのコードを格納します。
メソッド領域は、仮想マシンの起動時に作成されます。メソッド領域は論理的にはヒープの一部ですが、単純な実装ではガベージコレクションもコンパクト化も選択しない場合があります。このバージョンのJava Virtual Machine仕様では、メソッド領域の場所や、コンパイルされたコードの管理に使用されるポリシーは必須ではありません。メソッド領域は固定サイズでも、計算の必要に応じて拡大してもよく、より大きなメソッド領域が不要になった場合は縮小できます。メソッド領域のメモリは連続している必要はありません。
したがって、(1)はい、仕様ではこれをどのように行うかは規定されていませんが、(2)従来の言語のコンパイル済みコードのストレージ領域に類似しています。テキストセグメント。これが私が述べているポイントです。