JVMがバイトコード命令をどのように消化するかを見る

JVMがバイトコード命令をどのように消化するかを見る

記事を書いてタイトルを考えるのは本当に頭の痛い作業です。文章はより技術的であり、堅苦しすぎると思われるかもしれません。もっと魅力的なことを書いたら「広告」とみなされるかもしれません。毎回読者数が3%未満なのを見ると、思わず「涙」が出てしまいます…

この記事が役に立った場合は、友人と共有し、「読む」をクリックしてサポートを示してください。

話題に戻りましょう。 JVM は私たち人間や他の生物と同じで、実行プロセスは私たちが食事をするのと同じだと考えているかどうかはわかりません。唯一の違いは、.class ファイルを食べ、栄養価が高いと思われる定数プールやバイトコード命令などを消化して吸収し、同時にゴミを処分することです。不要になったら、ゴミをすべて排出します。

.class ファイル全体の中で、バイトコード命令は非常に重要な部分です。メソッド内のすべてのロジックは、これらの命令を通じて完了します。

今日は説明書を見てみましょう。

命令

前に述べたように、命令セット(ISA)の実装には一般的に2つの形式があります。

  • レジスタベースの実装
  • スタックベースの実装

どちらにも長所と短所がありますが、JVM の場合、設計者は初期段階ですでにシナリオと目標を明確にしていたため、JVM で実装される命令セットはスタックベースで、命令数が少なく、形式がシンプルで、操作が少なく、理解しやすく実装しやすいなどの特徴があります。

一般に、典型的な命令セット システムでは、実装する必要がある操作は次のカテゴリに分類されます。

  • データ転送
  • 演算: 算術演算、論理演算、シフト演算など。
  • プロセス制御: 制御転送、条件付き転送、無条件転送、複合条件付き転送
  • 割り込み、同期、グラフィック処理(ハードウェア)など。

簡単に言えば、JVM のこれらの命令は、それぞれの回転に応じて、おおよそ次のことを行います。

1. ポーターと同様に、ローカル変数領域とオペランド スタック間でデータを移動します。たとえば、ローカル変数領域からオペランド スタックにロードし、計算してから、ローカル変数領域に保存し直します。

  • このタイプのコマンドは、異なるオペランド タイプに対応する iload_n、lload_n、aload_n などの異なる転送方向に従って、ローカル変数テーブルからオペランド スタックへのロード命令に分割されます。最初の文字は基本的に型を表し、i -> int、l -> long、a -> reference となります。次のnは数値です。
  • そして、オペランド スタックからローカル変数テーブルへのストア命令に分かれています: istore_n、lstore_n、astore_n など、型は上記と同じです。
  • ldc、bipush、iconst_i など、定数プールからスタックの先頭に直接ロードされるものもあります。

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

  • ダウンロードアドレス: https://github.com/ingokegel/jclasslib/releases

3. jclasslib ツールの対応するプラグインを IDEA にインストールできます。

javap と比較すると、グラフィカル インターフェイス ツールは使いやすいだけでなく、コマンド ラインも必要ありません。記述したコードによって生成されたバイトコードを簡単に表示できます。同時に、各メソッド内の対応するバイトコード命令は、ワンクリックで命令の公式説明にジャンプできるため、理解と学習にも便利です。

たとえば、上記のiconst_2コマンドは、このOracleの説明ページにジャンプします。

<<:  マルチクラウドの世界におけるプライベートクラウドの役割

>>:  注目すべきオープンソース クラウド ネイティブ プロジェクト 9 つ

推薦する

分散エッジコンピューティングの時代が到来

[[393301]]エッジ コンピューティングは数十年前から存在していますが、テクノロジーの継続的な...

Baidu のアルゴリズムは頻繁に更新されますが、抜け穴はどこにあるのでしょうか?

私はこのウェブサイトに10年近く携わってきました。楽しくてやりがいのある経験でしたが、同時にフラスト...

ユーザーをウェブサイトに留めておくための3つのルール

どうすればユーザーを維持できるでしょうか?この質問に対する本当の答えを求めている人は何千人もいます。...

ウェブデザイナーが従うべき2番目の効果的なデザイン原則:繰り返し

概要: 本書「A Design Book for Everyone」では、複雑なデザイン原則を、コン...

検索エンジンのユーザーエクスペリエンスアルゴリズム

検索エンジンが新しいアルゴリズムの時代に入って以来、検索エンジンのウェブサイトのスコアは、基本エクス...

#618# Henghost: 香港\日本\ロサンゼルス、クラウドサーバー28%オフ、スタンドアロンサーバー35%オフ、高防御保護30%オフ

henghost(恒創科技)は618年中旬特別キャンペーンを開始しました。今から6月30日まで、香港...

Alwyzon: オーストリア VPS、年間 35 ユーロ、2G メモリ/2 コア (EPYC)/40g NVMe/20T トラフィック

alwyzon は現在イースター セールを実施しており、オーストリアのウィーンで 100 個の VP...

ファン・ユン:ロサンゼルス cn2 vps、40 元 / 2g メモリ / 2 コア / 30g SSD / 10M 帯域幅無制限

新興企業のファン・ユンは、主にクラウドサーバーと独立サーバー事業を展開しており、クラウドサーバーは主...

ネットショップの既存顧客の返品率を10%から30%に上げる方法

近年、タオバオの発展が加速するにつれ、多くの伝統産業が誘惑に抵抗できず、タオバオ軍に加わっています。...

小さくて美しい O2O ビジネス事例 8 つ

国内のインターネットは王子たちの戦いのようで、BAT は世界を 3 つに分割し、インターネットのあら...

ベトナムサーバー: zenlayer、ハノイ/ホーチミンデータセンターオプション、30%割引、カスタムリソース、最大10Gの専用帯域幅

Zenlayer はベトナムのサーバー (ベトナム独立サーバー、ベトナム物理マシン) を提供し、カス...

ネットのゴミを一掃するという百度の決意は揺るがない

最近、ネット上で広く流布されている「6月22日」事件と「6月28日」事件をめぐっては、大きな論争が巻...

PayPal データサンプル: 中国の「電子商取引の新シルクロード」

世界中の消費者信頼感が低下する中、電子商取引は「Made in China」の新たなシルクロードとな...

バイトダンスの攻撃:コンテンツ配信だけでは満足しない検索ビジネスのレイアウト

「百度を蹴り、テンセントと戦い、微博に対処する」。今日頭条の親会社であるバイトダンスは絶えず動き出し...

エッジコンピューティング+クラウドコンピューティング、モノのインターネット実現の鍵

クラウド コンピューティングとエッジ コンピューティングは、モノのインターネット (IoT) の未来...