面接官向け Java 仮想マシンの概要

面接官向け Java 仮想マシンの概要

この記事では、主に Java 仮想マシンの最終コンパイル最適化、Java メモリ モデルとスレッド、スレッド セーフティ、ロックの最適化についてまとめます。残りの要約については、「Java 仮想マシン要約パート 1」および「Java 仮想マシン要約パート 2」をクリックしてください。

[[220438]]

1. 実行時の最適化

ジャストインタイムコンパイラ

ジャストインタイムコンパイラ JIT の役割は、ホットコードをプラットフォーム関連のマシンコードに変換し、最適化することです。仮想マシンに必要な部分ではありません。それはまさに最高の喜びだとしか言いようがありません。

ホットスポットコード

ホットスポットコード分類

  • 複数回呼び出されるメソッド
  • 複数回呼び出されるループ本体

ホットスポットの検出と判定方法

  • 仮想マシンは、サンプリング ホットスポット検出に基づいて、スタックの最上部を定期的にチェックし、特定のメソッドがスタックの最上部に頻繁に出現することを発見します。この方法はホットスポット方式です。シンプルで効率的ですが、正確ではありません。
  • カウンターホットスポット検出に基づいて、メソッドごとに実行回数をカウントするカウンターが確立されます。数値が閾値を超えるとホットメソッドとなります。 Hotpot はこの方法を使用します。方法カウンタ(統計的方法)、バックエッジカウンタ(統計的ループ)に分かれている

コンパイルプロセス(クライアントコンパイラ)

***ステージ

  • バイトコードを高レベル中間表現 (HIR) に構築する

フェーズII

  • HIR から LIR への変換

フェーズ3

  • 線形スキャンアルゴリズムを使用してLIRにレジスタを割り当て、マシンコードを生成します。

最適化手法

共通部分式の最適化

式 A の結果が計算され、A 内のすべての変数が変更されていない場合、次に A が使用されるときに計算する必要はなく、A の以前の結果が直接取得されます。

配列境界チェックの削除

メソッドのインライン化

脱出分析

エスケープの定義: メソッドで定義された変数は、他のメソッドにパラメーターとして渡されるか (メソッド エスケープ)、クラス変数に割り当てられます (スレッド エスケープ)。

最適化方法:

スタック上の割り当て: エスケープされないオブジェクトはヒープではなくスタックに割り当てられます。その後、スタック フレームがポップされたときにオブジェクトが占めるスペースを破棄できるため、ガベージ コレクション システムへの負荷が軽減されます。

同期の削除: 変数がスレッドから逃れないことが確実な場合は、この変数の同期手段を削除できます。

面接官向け Java 仮想マシンの概要

2. Java メモリ モデルとスレッド

メモリモデル

メモリ モデルについてここまで説明してきましたが、メモリ モデルとは一体何でしょうか?

特定の操作プロトコルの下で特定のメモリまたはキャッシュへの読み取りおよび書き込みアクセスの抽象化。

その機能は、プログラム内の各共有変数のアクセス ルール、つまり変数をメモリに書き込む方法と、メモリから変数を取得する方法を定義することです。 Java メモリ モデルは、メイン メモリと作業メモリに分かれています。すべての変数はメイン メモリに保存され、スレッドにはメイン メモリのコピーである独自の作業メモリがあります。スレッドは作業メモリの読み取りと書き込みのみが可能です。

8つのアトミック操作

  • ロック: メイン メモリ上で動作し、変数をスレッド専用としてマークする変数。
  • unlock: メインメモリ内の変数に作用します。ロック状態にある変数を解放します。変数が解放された後にのみ、他のスレッドによってロックできるようになります。
  • 読み取り: メインメモリ内の変数に作用します。後続のロード アクションで使用するために、変数の値をメイン メモリからスレッドの作業メモリに転送します。
  • load: 作業メモリ内の変数に作用し、読み取り操作によってメインメモリから取得した変数値を作業メモリ内の変数のコピーに配置します。
  • 使用: 作業メモリ内の変数に作用します。作業メモリ内の変数の値を実行エンジンに渡します。この操作は、仮想マシンが変数の値を使用する必要があるバイトコード命令に遭遇するたびに実行されます。
  • 割り当て: 作業メモリ内の変数に作用します。実行エンジンから受け取った値を作業メモリ内の変数に割り当てます。この操作は、仮想マシンが変数に値を割り当てるバイトコード命令に遭遇するたびに実行されます。
  • store: 作業メモリ内の変数に作用し、後続の書き込み操作のために作業メモリ内の変数の値をメインメモリに転送します。
  • 書き込み: メインメモリ内の変数に作用します。ストア操作によって作業メモリから取得した変数の値をメインメモリ内の変数に格納します。

揮発性変数の特別なルール

volatile の特徴は、この変数の可視性をすべてのスレッドに保証することです。つまり、変数の値が変更されると、他のスレッドはすぐにその変更を知ることができます。通常の変数の値が変更された後は、その値をメイン メモリに書き戻す必要があり、その後、他のスレッドがメイン メモリからデータを読み取ります。揮発性は、メモリバリアを通じて命令の並べ替えを禁止することもできます。一般的に言えば、読み取り操作は通常の変数と同様ですが、書き込み操作は少し遅くなります。

long および double 変数の特別なルール

8 つの操作は一般にアトミックですが、64 ビット データの場合、メモリ モデルにより、volatile によって変更されない 64 ビット データの読み取り操作と書き込み操作を 2 つの 32 ビット操作に分割できます ----> 非アトミック同意 ただし、一般に long と double を volatile として宣言する必要はありません。

優先権の原則

  • 手続きの順序に関する規則
  • モニターのロックルール
  • 揮発性変数のルール
  • スレッド開始ルール
  • スレッド終了ルール
  • スレッド中断ルール
  • オブジェクトの終了ルール
  • 推移性

Javaとスレッド

Java スレッド クラス API のほとんどはネイティブ メソッドであり、プラットフォームに依存します。

スレッドを実装する3つの方法

  • カーネル スレッドを使用して実装します。カーネル スレッドは、オペレーティング システム カーネルによって直接サポートされるスレッドです。カーネルはスレッドの切り替えを完了します。プログラムは軽量プロセス インターフェイスを使用して、カーネル スレッドと 1 対 1 の関係を確立します。その後、カーネル スレッドはスレッド スケジューラを通じて CPU にディスパッチされます。
  • ユーザー スレッドを使用して実装します。ユーザー スレッドの確立、同期、破棄、およびスケジュール設定はすべて、カーネル状態に切り替えることなく、ユーザー状態で完了します (1 対多の関係)。
  • ユーザー スレッド + 軽量プロセス: 多対多の関係。

スレッドのスケジューリング

共同スケジューリング

スレッドの実行時間はスレッド自体によって制御されます。実行が完了すると、システムにスレッドをアクティブに切り替えるように通知され、スレッドが長時間ブロックされる可能性があります。

プリエンプティブスケジューリング

システムは時間を割り当てます。スレッドは積極的に時間を放棄することはできますが、積極的に時間を取得することはできません。優先順位を設定することで順序が決まります。

スレッドのステータス

  • 新規: 作成されたばかりでまだ開始されていません
  • 実行中: 実行中または割り当てられた時間を待機中
  • ***待機: CPUによって時間が割り当てられず、他のスレッドを明示的に起動する必要があります
  • 限られた待機時間: 一定時間後にシステムによって自動的に起動されます
  • ブロック: 排他ロックを待機中
  • 仕上げる

3. スレッドの安全性とロックの最適化

スレッドの安全性の度合いは順番に低下する

  • 不変、オブジェクト内のすべての状態変数をfinalに設定する
  • 完全にスレッドセーフであり、スレッドセーフの定義に完全に準拠しています
  • 比較的スレッドセーフであり、このオブジェクトに対する個々の操作 (Vector、HashTable など) はスレッドセーフです。
  • スレッド互換。オブジェクト自体はスレッドセーフではありませんが、呼び出し側で同期メソッドを正しく使用することで、並行環境での正常な使用を確保できます。
  • スレッドの反対、呼び出し側がどれだけ努力しても、スレッドの安全性を達成することは不可能である

スレッドセーフな実装方法

1. 相互排他的な同期

synchronized キーワードは、コード ブロックの前と後にそれぞれ monitorenter 命令と monitorexit 命令を形成します。これら 2 つの命令には参照オブジェクト パラメータが必要です。ロックには同期を実現するためのカウンターがあります。カウンターは、入場時に +1、退場時に -1 になります。スレッドは再入可能であり、他のスレッドはブロックして待機する必要があります。 synchronized の欠点は、Java スレッドがオペレーティング システムにマップされるため、ブロックされたスレッドを起動するにはシステムの支援が必要であり、ユーザー モードからカーネル モードに転送する必要があり、プロセッサ時間が大量に消費されることです。

synchronized と比較した ReentrantLock の利点:

  • 中断を待つ
  • 公平なロック: ロックは適用された順序で取得される必要があります。
  • 複数の条件をロックしてバインドする

2. 非ブロッキング同期

スレッドのブロックとウェイクアップによって発生するパフォーマンスの問題を解決するには、まず共有データを操作します。競争がなければ成功するでしょう。それ以外の場合は補正します(成功するまで再試行を続けます)

3. 同期ソリューションがない

  • 再入可能コード
  • スレッド ローカル ストレージは、共有データの範囲をスレッドに制限します。 ThreadLocalMap は、ThreadLocalHashMap をキーとして使用し、ローカル スレッド変数を KV ペアの値として使用します。

ロックの最適化

ロック最適化ソリューションはいくつかあります。

  • スピンロック: スレッドのブロックとウェイクアップの消費を減らすために、スレッドはブロックされているときにビジーループ(スピン)を実行できます。
  • ロックの排除: 共有データの競合を伴わないロックを排除する
  • ロックの粗密化: コード ブロック内のオブジェクトを継続的にロックおよびロック解除する場合、コード ブロック全体を一度にロックしてパフォーマンスの低下を軽減できます。
  • 軽量ロック: CAS操作を使用して、競合なしで同期的に使用されるミューテックスを排除します。
  • バイアスロック: ロックは最初に取得したスレッドに偏ります。

<<:  エッジ コンピューティングはますます普及していますが、クラウド コンピューティングはどうでしょうか?

>>:  インターネット分散ストレージ入門

推薦する

ファイリングとコンピュータルームの切断とウェブサイトの運用とSEOの分析

最近のネットワーク障害は、ウェブマスターにとって厳しい時期だと言えます。私も例外ではありません。私の...

小紅書が「KOL一掃」、コンテンツ電子商取引は岐路に立つ!

小紅書が「KOL浄化」を開始して以来、その商業収益化の道筋は大きな注目を集めている。トラフィックが集...

エッジコンピューティングがスマートシティに力を与える:機会と課題

エッジ コンピューティングは、都市化の過程における我が国の経済的、社会的発展に大きな影響を与え、大き...

ステーションBに騙されないでください

Bilibili(以下、「 Bステーション」と略す)は、過去6か月間で最も注目を集めたインターネット...

新たな状況下で、中国の VMware になれるのは誰か?

11月25日、Sangfor傘下のクラウドコンピューティングブランドであるSangfor Cloud...

「スマートコーン」が北京でデビュー、Amapのブラックテクノロジーが公共交通の安全性を高める

道路工事は最も労働集約的で危険な職業の一つです。毎年、交通工事や道路清掃、事故処理などにより交通事故...

2018年はクラウドコンピューティングの転換点となるかもしれない: IaaS統合、PaaSの台頭、SaaSの勢いの拡大

2017 年のクラウド コンピューティング市場を振り返ると、この年はクラウド コンピューティングがさ...

マルチクラウド アプリケーションを構築するための 4 つのヒント

一般的に、マルチクラウドに関する議論を推進する力は 2 つあります。組織が必要とするクラウド コンピ...

Weibo とオンラインストアが出会ったとき、Weibo はどのようにしてオンラインストアの口コミ効果を実現できるのでしょうか?

ネットショップの運営はますます難しくなり、投資も増えていると多くの人が言っています。ネットショップの...

アリババの政府関係DingTalkアップグレードにより専用の仕事ポータルが作成

9月17日、2020年雲啓大会の「政府デジタル変革」セッションにおいて、政府業務向けDingTalk...

解決策と欠点: WeChat はマーケティング ツールからどれくらい遠いのでしょうか?

鋭い武器はその鋭さで知られ、第二に血を流します。武術の世界で最も有名な武器は、龍殺しの剣と天剣です。...

外部リンクの現在のリスクの分析例

かつては「コンテンツは王、外部リンクは皇帝」という言葉がありました。外部リンクはウェブサイトの重みを...

OpenStack Newton がリリース、EasyStack コアコード貢献が中国で第 1 位に

今週、OpenStack は 14 番目のバージョンである Newton を正式にリリースしました。...