Java仮想マシンのロック最適化の取り組み

Java仮想マシンのロック最適化の取り組み

パブリック プラットフォームとして、JDK 自体は並行プログラムのパフォーマンスに知恵を絞っており、並行処理中にシステム スループットを提供するために JDK 内であらゆる手段を試してきました。ここでは、JDK 内のいくつかの「ロック」最適化戦略を簡単に紹介します。

1. 方向をロックする

ロック バイアスは、ロック操作の最適化手法です。

スレッドがロックを取得すると、ロックはバイアス モードになります。このスレッドが再度ロックを要求する場合、同期操作は必要ありません。これにより、ロック要求操作が大幅に削減され、プログラムのパフォーマンスが向上します。

したがって、ロックの競合がほとんどない状況では、同じスレッドが同じロックを連続して複数回要求する可能性が非常に高いため、バイアス ロックの方が最適化効果は高くなります。ただし、ロックの競争が激しい状況では効果は良くありません。なぜなら、激しい競争の場合、異なるスレッドが毎回同じロックを要求するという状況が最も起こりやすいからです。いくつかの一般的なロックについて詳しくは、ここをクリックしてください。

[[243266]]

2. 軽量ロック

バイアス ロックが失敗した場合、前回ロックを要求したスレッドはこのスレッドと同じではありません。バイアスをロックできない場合は、同期操作を回避できません。このとき、仮想マシンはスレッドを直ちに中断しません。軽量ロックと呼ばれる最適化を使用します。

軽量ロックの操作も非常に便利です。これは、オブジェクト ヘッダーをポインターとして使用して、Chiyou ロックのスレッド スタックの内部を指し示し、スレッドがオブジェクト ロックを保持しているかどうかを判断します。スレッドが軽量ロックを正常に取得すると、クリティカル セクションにスムーズに入ることができます。軽量ロックが失敗した場合、他のスレッドがロックをプリエンプトしたことを意味し、現在のスレッドのロック要求は重量ロックに拡張されます。いくつかの一般的なロックについて詳しくは、ここをクリックしてください。

3. オプションのロック

ロックが拡張された後、スレッドがオペレーティング システム レベルで実際にハングするのを防ぐために、仮想マシンは最大限の努力、つまり自己選択ロックを実行します。現在のスレッドは一時的にロックを取得できないため、いつロックを取得できるかは不明です。おそらく、数 CPU クロック サイクル後にロックを取得できるでしょう。この場合、スレッドを単に一時停止するだけではコストがかかりすぎる操作になる可能性があるため、システムは賭けに出ます。つまり、スレッドが近い将来にロックを取得できると想定します。

したがって、仮想マシンは現在のスレッドに空のループを実行させます。数回のループの後、ロックを取得できれば、クリティカル セクションに正常に入ります。ロックを取得できない場合、スレッドは実際にはオペレーティング システム レベルで中断されます。

4. ロックの除去

ロックの除去は、より徹底したロックの最適化です。 JIT コンパイル中、Java 仮想マシンは実行コンテキストをスキャンして、共有リソースの競合の可能性がないロックを削除します。ロックを排除することで、無意味なロック要求時間を節約できます。

以下の状況では、ベクターを使用し、ベクター内で同期要求ロックを使用します。

  1. パブリック文字列[] createStrings(){
  2. ベクトル<文字列> v = 新しいベクトル<文字列>();
  3. ( int i=0;i<100;i++)の場合{
  4. v. ( Integer .toString(i) )を追加します
  5. }
  6. v.toArray(新しいString[]{})を返します
  7. }

V は createStrnigs 関数でのみ使用されるため、単なるローカル変数です。ローカル変数はスレッド スタック上に割り当てられ、スレッド専用のデータであるため、他のスレッドからはアクセスできません。したがって、この場合、Vector 内のすべてのロック同期は不要です。仮想マシンがこの状況を検出すると、これらの無駄なロック操作を削除します。いくつかの一般的なロックについて詳しくは、ここをクリックしてください。

ロック解除に関わる重要な技術はエスケープ解析です。いわゆるエスケープ分析は、変数が特定のスコープから脱出するかどうかを観察することです。この場合、変数 v は明らかに createString 関数をエスケープしません。これに基づいて、仮想マシンは v 内のロック操作を大胆に削除できます。createStrings が String 配列ではなく v 自体を返す場合、変数 v が現在の関数から脱出したと見なされ、v が他のスレッドからアクセスされる可能性があります。この場合、仮想マシンは v 内のロック操作を排除できません。

エスケープ解析は -server モードで実行する必要があります。 -XX:DoEscapeAnalysis パラメータを使用してエスケープ分析をオンにし、-XX:+EliminateLocks パラメータを使用してロック除去をオンにすることができます。

<<:  [AWS コミュニティディスカッション活動概要 3] クラウドデータベースの長所と短所

>>:  面接でJava仮想マシン(JVM)について質問されたら、この記事を読んでください。

推薦する

Alibaba Cloud PolarDB はどのようにして 6 倍のパフォーマンス差と 100 TB の容量を実現するのでしょうか?

I. PolarDB 製品アーキテクチャの概要PolarDB は、第 3 世代のクラウド コンピュー...

48 時間以内に Baidu のトップ 3 に入ることは信頼できるのでしょうか?

最近では、主要なウェブマスターフォーラムのすべてに、48時間以内にBaiduでトップ3にランクインす...

Amazon SageMaker は、Xingzhe AI がゲーム コンテンツのフィルタリングで 96% の精度を達成するのを支援します

記者が星浙AI(成都千智人工知能科技有限公司傘下のブランド、星浙.ai)から得た情報によると、同社が...

VMware は、企業が生成 AI の力を簡単に活用できるよう支援します。

2023 年 8 月 23 日、VMware Explore 2023 カンファレンスにおいて、VM...

インターネットマーケティング - セルフマーケティング

マーケティングを行うときは、まず自分自身をマーケティングしなければならないと言う人がいます。この発言...

有名ブロガーから学ぶウェブサイトの直帰率を下げる方法

誰もが Lu Songsong を知っていると思います。彼のブログは、中国で最も優れた個人ブログの ...

JVMの動作原理とスタックとヒープの実装プロセスの詳細な説明

[[267906]]概要オンライン システムでは CPU 100% 問題が発生するため、トラフィッ...

ネットワークマーケティングと魚池理論を組み合わせた思考指導

インターネット マーケティングにおける長年の経験により、私は独自のインターネット マーケティング思考...

デジタル時代におけるクラウドコンピューティングとエッジコンピューティングの違い

クラウド コンピューティングとエッジ コンピューティングはよく議論されますが、機能が異なる場合があり...

ブランドマーケティングプロモーション: HEYTEA はどのようにしてブランドを構築しているのでしょうか?

企業の事業運営の核となる結果は顧客の心の中にあり、顧客の選択に影響を与えます。この核となる結果がブラ...

SEO におけるウェブサイトのキーワード競争力を分析する 5 つの方法

SEO におけるウェブサイトのキーワード競争力を分析する 5 つの方法1. キーワードの検索結果数(...

2022 年に避けるべきクラウド コスト最適化の 6 つの間違いとその修正方法

翻訳者 |李睿校正 |孫淑娟 梁策企業や組織は毎年末に、事業規模の拡大やクラウドコストの削減など、翌...

5G時代のもう一つの「爆発的な」アプリケーション、クラウドゲームの未来とは?

5Gは何ができるのか?これは、過去 2 年間、誰もが探求してきた質問です。 4月15日、百度はオンラ...

百度:クラウドオープンプラットフォームの「新ホームページ」レイアウト

テンセントの製品における「マイクロイノベーション」がイノベーションだと考える人はいないが、百度が検索...