のクラスメンバ関数に割り当てられているどのように私は私に似た質問が見つかりました:は、メモリはJava
を見つけることができる、「?一回またはオブジェクトのすべてのインスタンス化に割り当てられたクラスのメンバー関数のコードメモリです」しかし答えは、C/C++の場合についてのみ話しました。 Javaを使用している場合、誰でもこの質問に対する答えを教えてください。
のクラスメンバ関数に割り当てられているどのように私は私に似た質問が見つかりました:は、メモリはJava
を見つけることができる、「?一回またはオブジェクトのすべてのインスタンス化に割り当てられたクラスのメンバー関数のコードメモリです」しかし答えは、C/C++の場合についてのみ話しました。 Javaを使用している場合、誰でもこの質問に対する答えを教えてください。
これは簡単な答えではありません。
コードはクラスがロードされたときに一度ロードされますが、コードは他のクラスのメソッドにインライン化できます(したがって、他のクラスがロードされるたびに読み込まれます)。クラスはガベージコレクションされ、コードが再びロードされます。
割り当ての多くの側面は、VMの実装にも依存します。
答えは基本的にあなたの他の質問と同じですが、それはもっと動的です。最も普及しているSun/Oracle VMの場合:実行可能コードは、JIT(Just-In-Time)コンパイラによってオンデマンドでコードキャッシュにコンパイルされ、Hotspotコンパイラによってオンザフライでさらに最適化(インライン展開)されます。
メソッドがメソッドポインタと呼ばれるとき、メソッド変数の参照と値がコンテキストとしてスタックに配置され、コードキャッシュ内のコードが実行されます。
一度またはオブジェクト
のすべて インスタンスに割り当てられたクラスのメンバ関数コードメモリであり、これはない一度オブジェクトごと、クラスごとに一度割り当てられます。正確に言えば、クラス/クラスローダのペアごとに1回割り当てられます。コンパイラがJITやHotSpotが何を含んでいても理解できる限り、コンパイラによって割り当てられると考えることができます。