面接官向け 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操作を使用して、競合なしで同期的に使用されるミューテックスを排除します。
  • バイアスロック: ロックは最初に取得したスレッドに偏ります。

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

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

推薦する

#ニュース# Namesilo が買収され、今後の上場にいくつかの変更が加えられる予定です

さて、3月8日のニュースです。Brisio Innovations Inc が有名なドメイン名会社 ...

同じサーバー、同じ業界の検索エンジンにおける不正行為の問題を排除する方法

お金を節約し、検索エンジンのランキングを独占するために、一部のウェブマスターは、1つの業界向けに複数...

バイトダイナスティー:月額19元、3ネットワークバックホールcn2 gia、512Mメモリ/1コア/8g SSD/512Gデータトラフィック

Bytedynastyは香港データセンターに続き、米国ロサンゼルスのCeraデータセンターでもVPS...

SEOは簡単ですか?

SEOをうまく行うことと運営を成功させることの間には長い道のりがある数日前、Dianshi の友人が...

クイックパケット - $35/L5630/24g メモリ/1T ハードディスク/4IP/20T トラフィック/ロサンゼルス

Quickpacket は創立 14 周年を記念し、プロモーション用に自社専用サーバーを 2 台リリ...

SEOにおけるiframeタグの長所と短所を分析する

iframe タグについて学んだとき、あまり役に立たないと思ったのを今でも覚えています。その後、しば...

中国企業のクールカスタマーマーケティング:企業がコストゼロで数千万の露出を獲得できるよう支援

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています導入:これ...

海外メディアは、Weiboが4月17日に上場すると報じた。

【TechWeb Report】昨日、米国の金融ウェブサイトiposcoopによると、Weiboは米...

インターネット上の小規模な「創設チーム」はどうすれば成功できるのでしょうか?

昨日、Instagram が Facebook に 10 億ドルで売却されたことを知りました。しばら...

UNIQLO JUMPコラボでお財布が空になる!ユニクロは叱られて泣いた!

ユニクロはただ問題を起こそうとしているだけだと思います! 4月23日、週刊少年ジャンプとコラボしたU...

itldc (1995~): 無制限帯域幅の VPS、40% オフ、年間 23 ユーロ、米国、シンガポールなどで 15 のデータ センターが利用可能。

1995年に設立されたブルガリアの企業itldcは、15のデータセンターの「無制限トラフィックVPS...

ウェブサイトで活用すべき Google アナリティクスのヒント 11 選

ウェブマスターの友人がソーシャル メディア、フォーラム、または電子メール リンクで毎日受ける最も一般...

hostkvm: 韓国の VPS、30% 割引コード、韓国の cn2+BGP、月額 7 ドル、4G メモリ/2 コア/40g ハードディスク/1.2T トラフィック

Hostkvm は韓国のデータセンターで新しい VPS サービスを開始し、30% 割引プロモーション...

「分散コンピューティング」の未来:クラウドコンピューティングは終わった

編集者注: OpenAI の元研究科学者である Andrej Karpathy 氏は、ディープラーニ...