面接中に JVM に関連する質問をされると、多くの面接者は機械的に暗記しており、詳細を尋ねられると答えるのをやめてしまうことに気付くでしょう。彼らは暗記するタイプで、おそらく意味を理解せずに本の中の大まかな概念や絵を覚えているだけでしょう。 実際、このコンテンツを読む際には、簡単なプログラム分析と比較するとより理解しやすくなります。始めましょう。 市販されている一般的な JVM の本では、JVM のアーキテクチャは一般に次の部分に分かれています。
項目 2 ~ 7 は、ランタイム データ領域とも呼ばれます。結局のところ、これらは JVM が実行されているときにのみ作成されます。この分類は基本的に Java 仮想マシン仕様を参照します。 無意味に概念を暗記すると、食べた後に忘れてしまう可能性があります。次に、1+2 プログラムを使用して理解してみましょう。 Java プログラミングを初めて学ぶときに、ほとんど全員が書いたことがある Hello World に似たプログラムを見てみましょう。
javac でコンパイルした後、javap -verbose HelloWorld を使用して観察すると、次のような出力が表示されます。
わかった。上記は Java バイトコードであることは誰もが知っています。上記の出力から、自分自身を仮想マシンとして想像して実行すると、Java 仮想マシンのさまざまな部分を理解できるようになります。 まず、コンテンツのこの部分を実行するには、まずメモリに読み込む必要があります。これらのコンテンツを読み取る負荷は、仮想マシンのクラス ローダーです。 ロードされるのは実際にはバイナリ ストリームであり、使いやすいように対応する形式に整理する必要があります。たとえば、このクラスの名前は何なのか、誰から継承されているのか、どのようなメソッドがあるのか、メソッド名は何なのか、内容は何なのか、などです。これらのものはどこかに保管する必要があります。どこに置けばいいですか?メソッド領域はこのためのものです。 いわゆるランタイム定数プールもメソッド領域内の領域です。調べてみると、定数プールは実行時に実行時定数プールに解析されます。他のクラスへの参照などが含まれる場合、ここでのシンボリック参照は、ロード後のリンク時に直接参照に変換されます。 他の部分はどうですか?一般的に、メソッド内の特定のコンテンツを実行するために使用されるのは、Java 仮想マシン スタック (よくスタックと呼ばれるもの) です。この部分は実はこのように理解することができます。 Java 仮想マシンは、実際の物理マシンと同様に、プログラムによって提供される命令を実行しますが、仮想マシンは限られた命令セットを提供するソフトウェアです。物理マシンは基本的にレジスタに基づいて実行されますが、Java 仮想マシンの命令の実行はスタックに基づいています。 スタックなので、スタックには何を入れればよいでしょうか?そうです、それはスタック フレームであり、IDE デバッグを使用するときに表示されるレイヤーごとのコンテンツです。 各メソッドが呼び出されるとフレームが表示されます。各フレームも構造体であり、メソッドの実行に使用されるすべてのものがその中に含まれています。たとえば、デバッグ時には通常、各変数とその値が表示されます。これらの変数はローカル変数と呼ばれます。上記の出力には、stack=2、locals=4、args_size=1 があります。 locals はローカル変数、args_size はメソッド パラメーターの長さ、その他はオペランド (スタック)、値はスタックの最大深度であることがわかります。 各クラスのどのメソッドにもフレームがあり、フレームには独自のローカル変数テーブル、独自のオペランド スタック、およびランタイム定数プールへの参照があります。もちろん、デバッグ情報などの拡張情報も含まれる場合があります。 具体的には、上記の単純な 1+2 演算は、次の JVM 命令に対応します。
現在実行されている命令を知るための識別子が必要であり、このタスクはプログラム カウンターによって実行されます。その男は、次に実行される命令を指さし続けました。基本スタックの実装。上記の手順では、大まかに言って、定数 1 を最初の変数に割り当て、定数 2 を 2 番目の変数に割り当てます。その後、変数 1 がスタックにプッシュされ、変数 2 がスタックにプッシュされます。 iadd 操作が実行されると、2 つのデータがスタックからポップされ、合計が完了し、変数 3 に割り当てられ、スタックにプッシュされてから返されます。これについては、次回 JVM 命令について説明するときに詳しく説明します。もちろん、これらの命令の実行は実行エンジンから切り離すことはできません。 ネイティブ メソッドを実行する必要がないため、JNI などのローカル メソッド実装用に用意されているローカル メソッド スタックは通常使用しません。 1+2 のプロセスを観察してみると、Java 仮想マシンの基本的な構造が理解できましたか? :-) それでも思い出せない場合は、このように考えてみてください。 Java の世界では、ヒープとスタックがよく言及されます。スタックには何が保存されますか?デバッグ時に見たフレームのレイヤーについて考え、次に今日の 1+2 の実行について考えれば、すべてがわかるはずです。 この記事はWeChatの公開アカウント「Tomcat Things」から転載したものです。以下のQRコードからフォローできます。この記事を転載する場合は、Tomcat Things の公開アカウントにご連絡ください。 |
>>: 平安クラウドの「魔法の武器」は企業のR&Dライフサイクル全体を完全に保護します
moonvm は、henet と APOL データ センターから選択できる台湾の VPS、主に台湾の...
旅行から戻って、すべて順調です。 5日間はとても短いです。振り返ってみると、青い海と空、そして白い砂...
外部リンクは、SEO の中核から切り離せないトピックです。外部リンクソースの選択方法、外部リンク計画...
冒頭の言葉本日より、私(ID:yuanhangjx、ニックネーム:袁航自動車学校SEO)は、自分の仕...
friendhostingはバレンタインデーにVPSを1回限り40%割引で提供しており、更新は元の価...
ウェブサイトの降格問題に遭遇すると、多くの人がまず百度を思い浮かべ、他人を責め、百度が現状を回復する...
リトアニアの会社であるbacloudは、2007年に設立され、それ以来運営されているサーバープロバイ...
あなたはプログラマーです。コードを使用してブログ アプリケーション サービスを作成し、クラウド プラ...
この記事は、主に著者が所有するウェブサイトで発生した問題に対処するために書かれています。著者のウェブ...
SEO に詳しい友人は皆、「コンテンツこそ王様」という言葉を知っていますが、「コンテンツこそ王様」が...
【ユートピア】オンライン百科事典の定義によれば、「ユートピア」は「理想郷(理想社会)」とも呼ばれ、理...
モルドバの会社 pqhosting はルーマニアのデータセンターでルーマニアの VPS を運営してお...
企業のデジタル変革が加速する中、クラウド コンピューティングはかつて、熾烈なインターネット市場におけ...
Zitian がブロックされた場合、Web サイトに損失を与えない解決策があります。同時に、何人の ...
近年、多くの企業がビジネスをクラウド コンピューティング プラットフォームに移行しています。この移住...