私はJVM(HotSpot)を初めて使用し、そのアーキテクチャとその仕組みを理解しようとしています. JVMがクラスファイルをロードするとき、すべてのメソッドをどこかにロードしますか? メソッド領域が好きですか?またはネイティブメソッドスタック?
6 に答える
これはJVMの実装に依存します。JVMが異なれば、これをさまざまな方法で処理することを選択できます(Java仕様に準拠している場合)。したがって、絶対的な保証はありません。
Sun / Oracle JVMでは、メソッドデータは「パーマネントジェネレーション」と呼ばれる特別なメモリ領域にロードされます。これは、クラスなどの長寿命オブジェクト用にガベージコレクタによって予約されたメモリ領域です。
他のほとんどの「産業用」JVMは、同様のことを行う可能性があります。
見る:
- https://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation
- Javaメモリプールはどのように分割されますか?
- http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
PS
これはすべて非常に高度なものです。JavaやJVMをうまく利用するために、これについて何も知る必要はありません。一般に、JVMがユーザーに代わってメモリ管理を行い、効率的に実行すると想定する必要があります。専門家による長年の調整が行われています。
JVMの要点は、結局のところ、特定のプラットフォームの実装の詳細から抽象化できるようにすることです......
正確には、
すべてのメソッド (静的および非静的) がメソッド領域にロードされます。
メソッド呼び出し、ローカル変数、中間結果、および実行行がスタックに格納されます。
メソッドが実行されている場合、それはスタックの一番上にあります。実行が完了すると、すべての結果が消去されます。ローカル参照変数がある場合、それらは無効になります。
実行中のメソッドに関係なく、メソッド Area にはクラス情報があります。これはブラウザのキャッシュに似ており、JVM に必要な情報を保持しています。
一般的に、JVM の要点に関するこの素晴らしい記事を読むことをお勧めします。
https://anturis.com/blog/java-virtual-machine-the-essential-guide/
はい、すべてのメソッドがバイト コードに変換されます。バイトコードファイルは、jvm がロードする中間ファイルです。
jvmがクラスファイルをロードするとき? クラスが最初に使用されたときに実行されます -- いくつかの状況が含まれます:
- クラスのインスタンスの作成: new 演算子、リフレクション、クローン メソッド、または逆シリアル化。
- クラスの静的メソッドを呼び出します。
- final static 変数を除くクラスまたはインターフェイスの static 変数を使用または評価します。それらはコンパイル時の定数であるためです。
- リフレクションによるメソッドの呼び出し。
- クラスのサブクラスをロードしています。インターフェイス以外のクラスに対してのみ機能します。
- jvm のブートストラップ クラス。例えば。メインメソッドを含むクラス。
- インターフェイスを実装するクラスを初期化するときにインターフェイスを初期化する必要はありませんが、ロードする必要があります。
はい、メソッドはメソッド領域にロードされます。つまり、バイトコードファイルがメソッド領域にロードされます。