記事を書いてタイトルを考えるのは本当に頭の痛い作業です。文章はより技術的であり、堅苦しすぎると思われるかもしれません。もっと魅力的なことを書いたら「広告」とみなされるかもしれません。毎回読者数が3%未満なのを見ると、思わず「涙」が出てしまいます… この記事が役に立った場合は、友人と共有し、「読む」をクリックしてサポートを示してください。 話題に戻りましょう。 JVM は私たち人間や他の生物と同じで、実行プロセスは私たちが食事をするのと同じだと考えているかどうかはわかりません。唯一の違いは、.class ファイルを食べ、栄養価が高いと思われる定数プールやバイトコード命令などを消化して吸収し、同時にゴミを処分することです。不要になったら、ゴミをすべて排出します。 .class ファイル全体の中で、バイトコード命令は非常に重要な部分です。メソッド内のすべてのロジックは、これらの命令を通じて完了します。 今日は説明書を見てみましょう。 命令 前に述べたように、命令セット(ISA)の実装には一般的に2つの形式があります。
どちらにも長所と短所がありますが、JVM の場合、設計者は初期段階ですでにシナリオと目標を明確にしていたため、JVM で実装される命令セットはスタックベースで、命令数が少なく、形式がシンプルで、操作が少なく、理解しやすく実装しやすいなどの特徴があります。 一般に、典型的な命令セット システムでは、実装する必要がある操作は次のカテゴリに分類されます。
簡単に言えば、JVM のこれらの命令は、それぞれの回転に応じて、おおよそ次のことを行います。 1. ポーターと同様に、ローカル変数領域とオペランド スタック間でデータを移動します。たとえば、ローカル変数領域からオペランド スタックにロードし、計算してから、ローカル変数領域に保存し直します。
2. 職人のように、研磨や加工を施して、石を彫刻のような形に変えていきます。たとえば、int を long に、double を int に変換する場合、対応する JVM 命令は i2l と d2i 2 で、ソース タイプが前にあり、ターゲット タイプが後ろにあります。 3. オブジェクトの作成、配列の作成、型の操作など、新しい生命の誕生。新しいクラスインスタンスnewを作成し、新しい配列newarrayを作成します。たとえば、getstaticはクラスの静的フィールドにアクセスし、getfieldはクラスのインスタンスフィールドを取得して、オブジェクトが特定の型instanceofに属しているかどうかを判断します。 4. 信号機のように道路上の交通の方向を誘導し、プログラムの流れを制御します。条件付き転送: よく使われる if (x == 1) のように、バイトコードになると、try-catch バイトコードでよく見られる if_icmpne や goto となり、無条件ジャンプになります。また、スイッチ構文をサポートする tableswitch などの複合条件転送もいくつかあります。 String をサポートする switch については、コンパイル時に String に対応する hashCode を取り出して int 値として使用し、case が不連続になる状況を処理するには lookupswitch を使用します。 5. プログラマーであるあなたや私と同じように:-)、PM が要件を提示した後は、それを実装する責任が私たちにはあります。 JVM では、これらは命令を計算する作業です。たとえば、int 加算 iadd、int 減算 isub、インクリメント iinc などです。 6. 関数呼び出し、実行戻りなどもあります。静的メソッドと非静的メソッドでは、対応する命令が若干異なります。たとえば、invokevirtual は通常のインスタンス メソッドを呼び出し、invokestatic はクラスの静的メソッドを呼び出します。そして、クラス初期化メソッド init は、invokespecial を通じて呼び出されます。メソッドが呼び出された後、通常は return によって呼び出しが終了し、void が返されます。戻り型データの場合は戻ります。ここでの T は、前に説明したさまざまなデータ型と同じです。たとえば、int 型の値が返される場合、対応する命令は ireturn です。 7. 例外が発生した場合は、athrow 命令によって例外をスローします。例外処理の原則については、前回の記事を参照してください。記述した try-catch-finally は... 学習のためのツール この部分に興味があるなら、日常の開発で使える小さなツールがいくつかあります。 1. Java に付属する javap と同様に、そのまま使用できます。 2. グラフィカルインターフェースツール jclasslib
3. jclasslib ツールの対応するプラグインを IDEA にインストールできます。 javap と比較すると、グラフィカル インターフェイス ツールは使いやすいだけでなく、コマンド ラインも必要ありません。記述したコードによって生成されたバイトコードを簡単に表示できます。同時に、各メソッド内の対応するバイトコード命令は、ワンクリックで命令の公式説明にジャンプできるため、理解と学習にも便利です。 たとえば、上記のiconst_2コマンドは、このOracleの説明ページにジャンプします。 |
<<: マルチクラウドの世界におけるプライベートクラウドの役割
>>: 注目すべきオープンソース クラウド ネイティブ プロジェクト 9 つ
ウェブサイトの所有者にとって、検索エンジンでウェブサイトのランキングを良くすることは最も重要なことで...
「2020年、世界のロボット収益市場価値は初めて1,000億米ドルを超え、2025年には5,000億...
最近、Baidu にインデックスされたページのほとんどにサムネイルを抽出する現象が発生しており、対象...
通常の SEO 最適化プロセスでは、多くのウェブマスターが専門的なトレーニングを受けておらず、いわゆ...
企業にとって、クラウド コンピューティングを導入するという決定は簡単です。企業がクラウド コンピュー...
shockhosting は 2000 年から運営されており、実際には数年の経験を持つアメリカの企業...
平均注文額を増やす最善の方法は、質の高い訪問者を獲得するだけでなく、買い物中にさらに多くの商品を購入...
ご存知のとおり、外部リンクはクリックに応じて 2 つのタイプに分けられます。1 つはクリック可能で、...
パンデミックが拡大するにつれ、あらゆる業界の組織が、従業員にリモートワークをさせてコストを削減すると...
企業は、多くのアプリケーション タイプに柔軟性、迅速な拡張性、信頼性を提供するパブリック クラウドに...
6月14日、アリババクラウドは、ローカルデータセンターに導入できる初のエンタープライズレベルのブロッ...
今日、ブログを使って外部リンクを最適化することについて話すと、多くのウェブマスターの友人は間違いなく...
インターネットでお金を稼ぐ秘密の方法はありません。中国人の本質は他人を真似ること、または率直に言えば...
6月30日、私はA5にBaiduのメジャーアップデートに関する記事を掲載しました。翌日、自分のアカウ...
ほとんどのウェブマスターは、インターネット上の写真の王様として知られるウェブマスター界のビッグブラザ...