コンセプト 仮想マシン: 完全なハードウェア システム機能をシミュレートし、完全に分離された環境でソフトウェア方式で実行される完全なコンピュータ システムを指します。これは物理マシンのソフトウェア実装です。一般的に使用される仮想マシンには、VMWare、Visual Box、Java 仮想マシン (Java 仮想マシン、略して JVM) などがあります。 Java 仮想マシン キャンプ: Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、Azul VM、Apache Harmony、Google Dalvik VM、Microsoft JVM… プロセスを開始する 基本的なアーキテクチャ Java ランタイムはソース コード (.java) をバイトコードにコンパイルし、それが jre によって実行されます。 jre は Java 仮想マシン (jvm) によって実装されます。 Jvm はバイトコードを分析し、解釈して実行します。 JVM は 3 つの主要なサブシステムで構成されています。 1. クラスローダーサブシステム 2. ランタイムデータ領域(メモリ) 3. 実行エンジン クラスローダーサブシステム クラスのロードには、ロード、接続 (検証、準備、解析 (オプション))、および初期化が含まれます。クラスのロード作業は、ClassLoader とそのサブクラスが担当します。 ロード: ハードディスク上のバイトコードファイルを探し、IOを介して読み取る 接続: 検証、準備、解析(オプション)の手順を実行します 検証、バイトコードファイルの正確性を検証する クラスの静的変数にメモリを割り当て、デフォルト値を割り当てる準備をする 解析し、シンボリック参照を直接参照に変換し、クラスによって参照される他のすべてのクラスをクラスローダーにロードします。 初期化:クラスの静的変数を指定された値に初期化し、静的コードブロックを実行します。 クラスローダーアーキテクチャ 1. クラス ローダーを起動します。これは、jre ターゲットの下にある rt.jar、charsets.jar などの JRE のコア クラス ライブラリをロードする役割を担います。 2. 拡張クラスローダー: JRE拡張ディレクトリextにJARクラスパッケージをロードする役割を担う。 3. システムクラスローダー: ClassPathパスの下のクラスパッケージをロードする役割を担う 4. ユーザー定義ローダー: ユーザー定義パスのクラスパッケージをロードする役割を担う クラスローディングメカニズム(親委任) 委任メカニズムの全体的な責任。 ClassLoader がクラスをロードする場合、別の ClassLoader が明示的に使用されない限り、そのクラスが依存および参照するクラスもこの ClassLoader によってロードされます。委任メカニズム: 最初に親クラスローダーにターゲットクラスの検索を委託し、ターゲットクラスが見つからない場合は、独自のパスでターゲットクラスを検索してロードすることを意味します。 ランタイムデータ領域 ヒープ(Javaヒープ) 仮想マシンの起動時に作成され、オブジェクト インスタンスを格納するために使用されます。ほぼすべてのオブジェクト (定数プールを含む) はヒープ上にメモリを割り当てます。オブジェクトがこのスペースのメモリを適用できない場合、OutOfMemoryError 例外がスローされます。ガベージコレクターが管理する主なエリアでもあります。 -Xmx および -Xms パラメータを使用して、最大ヒープ サイズと最小ヒープ サイズを指定できます。スレッドの共有。 スタック(Javaスタック) Java メソッド実行のメモリ モデルです。仮想マシンが Java メソッドを実行すると、実行中に各メソッドに対してスタック フレームが作成されます (ローカル変数テーブル、オペランド スタック、動的リンク、メソッド終了などの情報を格納するために使用されます)。スレッド限定。 Jvm はこの領域に対して 2 つの例外を指定します。 1. スレッドによって要求されたスタックの深さが仮想マシン スタックで許可されている深さよりも大きい場合、StackOverFlowError 例外がスローされます。 2. 仮想マシン スタックを動的に拡張できる場合、要求できるメモリ領域が不足すると OutOfMemoryError がスローされます。スタック スペースは jvm パラメーター –Xss によって指定され、スペースのサイズによって関数呼び出しの深さが決まります。 ネイティブメソッドスタック 仮想マシンのネイティブ メソッドを実行します。その他の仕様は Java スタックと同様です。この領域では、さまざまな種類の仮想マシンを自由に実装できます。スレッド限定。 PCレジスタ(プログラムカウンタ) 実行される命令のアドレスを格納するために使用されます。分岐、ループ、ジャンプ、例外処理、スレッド回復などの機能はすべて、pc レジスタに依存します。スレッド限定。 スレッドが Java メソッドを実行する場合、pc レジスタには実行される命令のアドレスが格納されます。ネイティブ メソッドが実行されると、pc レジスタは空になります。 メタデータ領域 メタデータ領域は永続世代に代わるもので、本質的には永続世代に似ています。どちらも、JVM 仕様のメソッド領域の実装です。違いは、メタデータ領域が仮想マシン内になく、ローカルメモリを使用することです。メタデータ領域が頻繁に使用されると、OutOfMemory 例外が発生する可能性があります。 メタデータ領域の動的な拡張。デフォルトの –XX:MetaspaceSize 値は、最高水準点の 21 MB です。一度触れると、Full GC がトリガーされ、役に立たないクラスがアンロードされ (クラスに対応するクラス ローダーが動作しなくなります)、最高水準点がリセットされます。新しい最高水準値は、GC 後に解放されたメタスペースによって異なります。解放されるスペースが少ないと、最高水準点が上昇します。解放されたスペースが多すぎると、最高水準点が下がります。 実行エンジン 実行エンジンはランタイムデータ領域内のバイトコードを読み取り、1つずつ実行します。 (1) インタプリタ: インタプリタはバイトコードをより速く解釈しますが、一度に 1 つの文を解釈して実行するので、実行速度は遅くなります。 (2)JITコンパイラ:JITコンパイラはインタープリタの欠点を解消します。実行エンジンは、インタープリターを介してバイトコードを変換し、繰り返しコードを検出すると、JIT コンパイラを使用してバイトコード全体をコンパイルし、ネイティブ コードに変換します。このネイティブ コードは繰り返しメソッド呼び出しに直接使用され、システムのパフォーマンスが向上します。 JIT のコンポーネントは次のとおりです。 中間コードジェネレーター: 中間コードを生成します。 コード オプティマイザー: 上記で生成された中間コードの最適化を担当します。 ターゲット コード ジェネレーター: マシン コードまたはネイティブ コードの生成を担当します。 プロファイラー: ホットスポット (何度も呼び出されるメソッド) を見つけるための特別なコンポーネント (3)ガベージコレクター:参照されていないオブジェクトを収集して削除します。プログラムは System.gc() を呼び出してガベージ コレクションをトリガーできますが、必ず実行されるとは限りません。 ネイティブ メソッド インターフェイス (JNI): JNI はネイティブ メソッド ライブラリと対話し、実行エンジンに必要なネイティブ ライブラリを提供します。 ネイティブ メソッド ライブラリ: 実行エンジンに必要なネイティブ ライブラリのコレクション。 ガベージコレクション (GC) 1. ゴミを識別し、リサイクル可能かどうかを判断するにはどうすればよいでしょうか? 参照カウント方式: 各オブジェクトにカウンターを追加します。オブジェクトがどこかで参照されると、カウンターは 1 増加し、参照が無効な場合は、カウンターは 1 減少します。オブジェクト カウンターが 0 かどうかは、オブジェクトがリサイクル可能かどうかを判断するために使用されます。欠点: 循環参照の問題を解決できない ルート検索アルゴリズム: 到達可能性分析法とも呼ばれ、"GC ROOTs" オブジェクトを検索開始点として使用し、参照を通じて下方向に検索します。通過するパスは参照チェーンと呼ばれます。オブジェクトがリサイクル可能かどうかは、オブジェクトが参照チェーンへのパスを持っているかどうかによって決まります (GC ルートとして使用できるオブジェクト: 仮想マシン スタックで参照されるオブジェクト、メソッド領域内のクラスの静的属性によって参照されるオブジェクト、メソッド領域内の定数によって参照されるオブジェクト、およびローカル メソッド スタック内の JNI によって参照されるオブジェクト) 2. Java のヒープは、GC がガベージを収集する主な領域です。 GC は、マイナー GC とフル GC (またはメジャー GC) の 2 種類に分けられます。 マイナー GC: 若い世代 (Young Gen) のスペースが不足している場合にコレクションがトリガーされます。 Java のほとんどのオブジェクトは通常、長期間存続する必要がないため、若い世代は GC コレクションが頻繁に行われる領域であり、コピー アルゴリズムが使用されます。 フル GC: 旧世代 (Old Gen) のスペースが不足している場合、またはメタスペースが最高水準点に達した場合にコレクションが実行されます。大きなオブジェクトや長期間存続するオブジェクトは大量のメモリ空間を占有し、リサイクル効率が低いため、マークスイープアルゴリズムが使用されます。 GCアルゴリズム リサイクル戦略に応じて、マークスイープアルゴリズム、マークコンパクトアルゴリズム、コピーアルゴリズムに分けられます。 1. マークアンドスイープアルゴリズム:「マーキング」と「スイープ」の 2 つの段階に分かれています。まず、リサイクル可能なオブジェクトをマークし、マークが完了したら、マークされたすべてのオブジェクトが占めるメモリ領域をリサイクルします。デメリット: 1. 循環参照を処理できない 2. 効率が低い 3. 大量のメモリフラグメントが生成される (追記: スペースの断片化が多すぎると、将来大きなオブジェクトを割り当てるときに十分な連続メモリスペースを適用できなくなり、新しいラウンドの GC が事前にトリガーされる可能性があります) 2. マークソートアルゴリズム:「マーキング」と「ソート」の 2 つの段階に分かれています。まず、リサイクルできるものに印を付けます。マークした後、オブジェクトを一方の端に移動し、境界の外側のメモリを直接クリーンアップします。 3. コピーアルゴリズム: メモリ空間を 2 つの等しい領域に分割し、一度に 1 つの領域のみを使用します。 gc 中、現在使用されている領域が走査され、使用中のオブジェクトが別の領域にコピーされます。このアルゴリズムは、使用中のオブジェクトのみを毎回処理するため、コピーコストは比較的小さくなります。同時に、コピー後にメモリを適切にソートできるため、「断片化」の問題は発生しません。デメリット: 1. メモリ使用率の問題 2. オブジェクトの生存率が高い場合、効率が低くなります。 パーティション処理に応じて、増分コレクションアルゴリズム、世代別コレクションアルゴリズムに分けられます。 1. 増分コレクション: リアルタイム ガベージ コレクション アルゴリズム。つまり、アプリケーションの実行中にガベージ コレクションが実行されます。理論的には、従来の生成方法によって発生する問題を解決できます。増分コレクションは、ヒープ領域を一連のメモリ ブロックに分割します。使用する際は、まず一部から使用してください。ガベージコレクションを行う際は、以前使用されていた部分に残っているオブジェクトを、後ろの未使用のスペースに配置します。これにより、従来の生成方法のように、使用がすべて完了した後にリサイクルのために一時停止する状況を回避し、使用しながら収集する効果が得られます。 2. 世代別コレクション: (商用デフォルト) オブジェクトのライフサイクルに基づいて、新世代、旧世代、メタスペースに分割され、異なるライフサイクルで異なるアルゴリズムを使用してオブジェクトをリサイクルします。 システムスレッドに応じて、シリアルコレクションアルゴリズム、並列コレクションアルゴリズム、同時コレクションアルゴリズムに分類できます。 1. シリアルコレクション: 単一のスレッドを使用してガベージコレクション作業を処理します。実装が簡単で、効率が高くなります。デメリット: 1. 複数のプロセッサを活用できない 2. ユーザースレッドを一時停止する必要がある 2. 並列コレクション: マルチスレッドを使用してガベージ コレクション作業を高速かつ効率的に処理します。理論的には、CPU の数が多いほど、並列コレクターが発揮できる利点は多くなります。デメリット: ユーザースレッドを一時停止する必要がある 3. 同時収集: ガベージ スレッドとユーザー スレッドが同時に動作します。システムはガベージコレクション中にユーザースレッドを一時停止する必要がない GC コレクター ガベージ コレクション アルゴリズムはメモリ リサイクルの理論的基礎であり、ガベージ コレクターはメモリ リサイクルの具体的な実装です。 1. シリアルコレクターは主に新世代のコレクションに使用されます。最も基本的かつ最も古いコレクターです。これはシングルスレッドのコレクターであり、作業中はすべてのユーザー スレッドを一時停止する必要があります。このコレクターはコピーアルゴリズムを使用します。 Serial Old コレクターは主に古い世代を収集し、シンプルで効率的ですが一時停止するマークスイープ アルゴリズムを使用します。 2. ParNew コレクターは、Serial のマルチスレッド バージョンです。新しい世代にはコピー アルゴリズムとマルチスレッド ガベージ コレクション (並列コレクター、応答優先度) を使用します。 3. Parallel Scavenge は、新世代のマルチスレッド コレクター (並列コレクター、スループット優先) 用のレプリケーション アルゴリズムを使用します。スループットと一時停止時間を制御できます。つまり、スループット = ユーザー コードの実行時間 / (ユーザー コードの実行時間 + ガベージ コレクション時間) です。 Parallel Old コレクターは、マルチスレッドとマーク アンド スイープ アルゴリズムを使用する Parallel Scavenge コレクター (並列コレクター) の旧世代バージョンです。 4. CMS (Current Mark Sweep) コレクターは、古い世代を対象としています。最短のリカバリ一時停止時間を得ることを目的としたコレクターです。これは、マークスイープ アルゴリズムを使用する並行コレクターです。 5. 新しい世代の G1 は ParNew に似ており、レプリケーション アルゴリズムを使用します。新しい世代の占有率が一定の割合に達すると、収集が始まります。旧世代は CMS に似ていますが、マークスイープ アルゴリズムを使用します。 したがって、G1 は、マルチ CPU およびマルチコア環境を最大限に活用できる並列同時実行コレクターです。また、予測可能な一時停止時間モデルを構築することもできます。 CMS コレクターと比較して、G1 コレクターには次の特性があります。 1. スペース統合: G1 コレクターは、メモリ スペースの断片化を引き起こさないマーク アンド スイープ アルゴリズムを使用します。大きなオブジェクトを割り当てると (Full GC の大きなオーバーヘッドを回避するために古い世代に直接入力せずに、短期間の巨大オブジェクトを格納するために特別に使用される Humongous 領域に直接割り当てる)、連続したスペースを見つけることができないため、次の GC が事前にトリガーされません。 (フル GC は、若い世代のコピー、古い世代の転送オブジェクト用の空きパーティションがない場合、または巨大なオブジェクト用の連続パーティションがない場合にトリガーされます。オーバーヘッドが非常に大きいため、回避する必要があります。) 2. 予測可能な休止。一時停止時間を短縮することは、G1 と CMS の共通の懸念事項です。 G1 は、短い一時停止時間の追求に加えて、予測可能な一時停止時間モデルを確立することもできます。これにより、ユーザーは、ガベージ コレクションに費やされる時間が N ミリ秒の期間内に N ミリ秒を超えてはならないことを明確に指定でき、Java Real-Time System (RTSJ) レベルのガベージ コレクターにほぼ達します。 3. G1 は Java ヒープを同じサイズの複数の独立した領域に分割します。新世代と旧世代の概念は保持されますが、物理的に分離されなくなりました。それらはすべて(おそらく不連続な)領域の集合です。 コレクターの一般的な組み合わせ JVM パフォーマンス チューニングのアイデア GCログを理解する
一般的な異常
GCパラメータ スタック設定
ガベージコレクション統計
コレクター設定
並列コレクター設定
CMS コレクター設定
G1コレクター設定
パフォーマンス分析および監視ツール
|
<<: 2020年のビッグニュース!同国はデジタル経済の発展に向けた8つの主要措置を提案し、国家統合ビッグデータセンターの建設を実施する予定である。
>>: Java バックエンド テクノロジー: Java 仮想マシン スタックの探索
「クラウド+」時代の到来により、クラウド コンピューティングを通じて企業のデジタル変革を実現すること...
OneVPS最新ニュース:中国のユーザーにより良いサービスを提供するために:1.ウェブサイトの支払い...
2017年はゲーム業界の競争が激化した年でした。広告主は大きなプレッシャーを感じており、ユーザー獲得...
米国の独立記念日が近づいています。eleven2.com では 50% 割引のプロモーションを実施し...
ウェブサイトのデザインでは明るい色が主流ですが、ミステリアスな雰囲気を際立たせ、控えめな高級感を醸し...
cerausの米国クラウドサーバーには、ceraデータセンターのほかに、enzuデータセンターもあり...
yourlasthost.com は、最近設立された新しいホスティング オペレータです。同社の事業に...
この記事はWeChatの公開アカウント「jameswhale's Technical Lif...
レシピ ウェブサイトのコンテンツを最新かつ優れたものにするにはどうすればよいでしょうか。著者は、ウェ...
tmthosting のシアトル VPS が 55% オフで販売されています。データ センターは米国...
gigsgigscloudの米国VPS-「SimpleCloud」は、四半期ごとの支払いが18ドル、...
モノのインターネット (IoT) デバイスと 5G テクノロジーが普及するにつれて、多くの企業がネッ...
パフォーマンスマーケティング当社では、KPI と結果重視のあらゆるプロモーションを「モバイル インタ...
buyvm のルクセンブルク VPS がなぜ人気があるのでしょうか? buyvm はカナダの会社であ...
ukrnames は 2007 年に設立され、2008 年に ICANN 認定を取得しました。同社の...