1. GCとは何かGC (ガベージ コレクション) ガベージ コレクションは、その名前が示すように、特にガベージをリサイクルするために使用されます。 C/C++ では、メモリを使用する必要がある場合は、まず手動で宣言し、使用後に手動でリサイクルする必要があります。これら 2 つのステップは非常に面倒であり、この点に関して問題が発生することがよくあります。これらはすべて Java で自動的に実行されるため、コードを書くときに無効なデータについて心配する必要はありません。 GC分類現在主流の仮想マシンのほとんどは、世代別コレクションの理論に基づいて設計されています。仮想マシン内のほとんどのオブジェクトは一時的なものであり、複数のガベージ コレクションを生き延びたオブジェクトはリサイクルが困難になるためです。したがって、理論上のヒープは、新しい世代と古い世代の 2 つの領域に分割されます。前者は主に生まれてすぐに死ぬオブジェクトを格納し、後者は死ににくいオブジェクトを格納します。 1. マイナー GC/ヤング GC: 新世代のみのリサイクルを指します。 2. 旧世代リサイクル(Major GC/Old GC):旧世代のみをリサイクルすることを指します。現在、古い世代をリサイクルするという個別の動作を持つのは CMS ガベージ コレクターだけです。 (メジャー GC の定義は非常に混乱を招きます。古い世代を指すという人もいれば、ヒープ全体のコレクションを指すという人もいます。これはシナリオによって異なります。固定の定義はありません。) 3. フルGC: Javaヒープとメソッド領域全体を収集します(メソッド領域も含まれることに注意してください) 3. ガベージコレクションアルゴリズム1. コピーアルゴリズムメモリ領域を半分に分割します。メモリの半分が使用されると、残っているオブジェクトをメモリ領域の残りの半分に配置します。元のメモリ領域が再利用されます。メモリ断片化領域を考慮する必要はありません。メモリを順番に割り当てるだけです。実装が簡単で、実行も効率的です。 しかし、メモリ使用率が 50% にしかならないという欠点もあるため、JVM では次の解決策があります。 アペルリサイクル エデンエリアの追加。一般的に、メモリ領域は次のように割り当てられます: Eden: 80%、Survivor: 20% (From 10%、To 10%)。 Survivor 領域が十分でない場合は、割り当て保証のために古い世代が必要になります。 2. マークスイープアルゴリズムは、「マーキング」と「クリーニング」の 2 つの段階に分かれています。最初のスキャンではリサイクル可能なすべてのオブジェクトをマークする必要があり、2 番目のスキャンでは最初のステップでマークされたオブジェクトをクリーンアップする必要があるため、効率が少し低下します。マークされたオブジェクトとクリアリングが大量に必要となるため、リサイクル効率はコピーアルゴリズムではありません。ほとんどのオブジェクトが一晩で生まれて死ぬ場合、マークされたオブジェクトが増え、効率は低下します。 もう 1 つの大きな問題は、大量のメモリ断片化が発生し、大きなオブジェクトを保存できなくなるため、事前に他のガベージ コレクションをトリガーする必要があることです。 3. マークコンパクト手順はクリア方法と同じですが、2 番目の手順では、マークの外側にあるすべてのオブジェクトを整理し、すべてのオブジェクトを前方に移動して、これらのオブジェクトの外側にあるメモリ領域を直接クリアします。マーキング方式ではメモリの断片化は発生しませんが、効率は低くなります。 ソート方式とクリア方式の主な違いは、一方がオブジェクトをリサイクルし、もう一方がオブジェクトをソートすることです。オブジェクトを移動するには、すべてのビジネス スレッドを一時停止し、すべてのオブジェクトへの参照を更新する必要があります (直接ポインターを調整する必要があります)。 JVM ガベージ コレクター1.シリアル/シリアルオールドJVM の初期に使用されていたガベージ コレクターは、シングル スレッド、排他的であり、単一の CPU に適していました。 数十から数百メガバイトのヒープメモリにのみ適しています。メモリサイズがこれを超えると回復効率が大幅に低下するため、現状では役に立ちません。 ストップ・ザ・ワールド(STW) 単一のスレッドがガベージ コレクションを実行する場合、コレクションが完了するまですべてのワーカー スレッドを一時停止する必要があります。この一時停止は「Stop The World」と呼ばれますが、この STW はユーザー エクスペリエンスを低下させます。たとえば、アプリケーションは実行時間ごとに 5 分間一時停止して応答する必要があります。これは、初期の JVM と Java が C/C++ 言語によってパフォーマンスが低いと批判された重要な理由でもあります。そのため、JVM 開発チームは STW 時間を排除または短縮するために懸命に取り組んできました。 2. パラレル/パラレルオールドJVM のリサイクル効率を向上させるために、JDK 1.3 以降では、JVM はマルチスレッド ガベージ コレクターを使用します。スループットに重点を置いたガベージ コレクターは、CPU 時間をより効率的に使用できるため、プログラムの計算タスクを可能な限り迅速に完了できます。 いわゆるスループットは、CPU がユーザー コードを実行するために使用する時間と CPU の総消費時間の比率です。つまり、スループット = ユーザー コードの実行時間 / (ユーザー コードの実行時間 + ガベージ コレクション時間) です。仮想マシンは合計 100 分間実行され、そのうちガベージ コレクションに 1 分かかったため、スループットは 99% です。 このガベージ コレクターは、数百メガバイトから数ギガバイトのヒープ スペースを回復するのに適しています。 JVMパラメータ設定 JDK1.8のデフォルトは次の組み合わせです -XX:+UseParallelGC 新しい世代はParallel Scavengeを使用し、古い世代はParallel Oldを使用します。 -XX:最大GC一時停止ミリ秒 ただし、このパラメータを小さい値に設定するとシステムのガベージ コレクションが速くなると考えるのは間違いです。ガベージ コレクションの一時停止時間の短縮は、スループットと新しい世代のスペースを犠牲にして実現されます。システムが新しい世代を小さいサイズに設定した場合、300 MB の新しい世代を収集する方が、500 MB の新しい世代を収集するよりも確実に速くなります。ただし、これにより、ガベージ コレクションの頻度も直接的に増加します。元の収集プロセスは、10 秒ごとに 1 回実行され、そのたびに 100 ミリ秒の一時停止がありましたが、現在は 5 秒ごとに 1 回実行され、そのたびに 70 ミリ秒の一時停止があります。一時停止時間は確かに短縮されましたが、スループットも低下しました。 -XX:GC時間比率 -XX:GCTimeRatio パラメータの値は、0 より大きく 100 未満の整数である必要があります。これは、ガベージ コレクション時間と合計時間の比率であり、スループットの逆数に相当します。 たとえば、このパラメータを 19 に設定すると、許容される最大ガベージ コレクション時間は合計時間の 5% (つまり、1/(1+19)) になります。デフォルト値は 99 で、最大 1% (つまり 1/(1+99)) のガベージ コレクション時間が許可されます。 ParallelScavenge はスループットと密接に関連しているため、「スループット優先のガベージ コレクター」です。 -XX:+アダプティブサイズポリシーを使用する -XX:+UseAdaptiveSizePolicy (デフォルトで有効)。これはスイッチパラメータです。このパラメータを有効にすると、新しい世代のサイズ (-Xmn)、Eden 領域と Survivor 領域の比率 (-XX:SurvivorRatio)、古い世代に昇格されるオブジェクトのサイズ (-XX:PretenureSizeThreshold) などの詳細なパラメータを手動で指定する必要がなくなります。仮想マシンは、現在のシステム動作状態に基づいてパフォーマンス監視情報を収集し、これらのパラメータを動的に調整して、最も適切な一時停止時間または最大スループットを提供します。 3. パーニュー/CMSパーニュー マルチスレッド ガベージ コレクターは Parallel に似ていますが、唯一の違いは、複数のスレッドと複数の CPU があり、Serial よりも一時停止時間が短いことです。 (JDK9 以降、ParNew は CMS に統合されました)。 同時マークスイープ (CMS) このタイプのガベージ コレクターは、最短の回復一時停止時間 (STW) を実現することを目的としています。現在、多数の Java アプリケーションがインターネットや B/S システムのサーバー側に集中しています。このようなアプリケーションは、サービスの応答速度に重点を置き、一時停止時間を短縮してユーザーエクスペリエンスを向上させることを目指しています。 マークスイープ 名前が示すように、このコレクターはマークスイープ方式を使用します。そして、その手順は以前のものよりも複雑です。 全体的なプロセスは 4 つのステップに分かれています。 初期マーキング: GC ルートに直接関連するオブジェクトのみをマークします。このようなオブジェクトは比較的少なく、マーキングは高速です。 同時マーキング: 最初にマークされたオブジェクトに関連付けられているすべてのオブジェクトをマークします。このようなオブジェクトは多数あるため、同時実行性が使用され、ユーザー スレッドと一緒に実行されます。 再マーキング: 同時マーキング中に変更されたオブジェクトのマーキングを修正します。このプロセスは初期マーキングよりも少し時間がかかりますが、同時マーキングよりもはるかに高速です。 同時クリーニング: ユーザー スレッドで実行してオブジェクトをリサイクルします。 -XX:+UseConcMarkSweepGC は、新しい世代には ParNew が使用され、古い世代には CMS が使用されることを意味します。 欠点: CPU 感度: 同時実行テクノロジが使用されるため、プロセッサ コアに対する要求が高くなります。 浮動ガベージ: CMS が同時クリアを実行する場合、同時高速を使用するため、クリア中にユーザー スレッドによって新しいガベージが生成されます。 したがって、リサイクル時には、生成されたガベージを保存するために一定の領域を予約する必要があります (JDK 1.6 で設定されたしきい値は 92%)。 ただし、ユーザー スレッドがすぐにガベージを生成し、予約されたメモリがそれを保持できない場合は、同時モード障害が発生します。この場合、仮想マシンは CMS の代わりに Serial Old を一時的に有効にします。 メモリの断片化: マークアンドスイープ方式が使用されるため、メモリの断片化が発生します。 特徴: 一般的に、CMS は JVM によって生成された最初の並行ガベージ コレクターであるため、依然として代表的なものです。マークアンドスイープ方式を使用するのはなぜですか? CMS を実装する場合、オブジェクトをソートすると、ビジネス スレッドを再度一時停止する必要があるためです。オブジェクトがソートされている場合、STW 時間は長くなります。 STW 時間を追求するために、マーク アンド スイープ方式は使用されません。 しかし、最大の問題は、CMS がマークアンドスイープ アルゴリズムを使用するため、メモリの断片化が発生することです。フラグメントが多数ある場合、大きなオブジェクトの割り当てに大きな問題が発生します。この問題を解決するために、CMS は -XX:+UseCMSCompactAtFullCollection というパラメータを提供しており、通常はオンになっています。大きなオブジェクトを割り当てることができない場合は、メモリの断片化処理が実行されます。 Serial Old は単一スレッドであるため、ここでは通常 Serial Old が使用されます。したがって、メモリ空間が大きく、オブジェクトが多数ある場合、これが発生すると CMS が停止します。 このガベージ コレクターは、数 GB から 20 GB 程度のヒープ領域の回復に適しています。 4. ガーベッジファースト(G1)G1 ガベージ コレクターの設計コンセプトは、これまでのすべてのガベージ コレクターの設計コンセプトとは異なります。以前のガベージ コレクターは世代別に設計されていましたが、G1 ではヒープ全体を同じサイズの独立した領域に分割された領域と見なします。各地域は必要に応じてエデン、サバイバー、旧世代エリアの役割を果たすことができます。物をリサイクルする際には、それぞれの地域の状況に合わせてリサイクルすることができ、効率性が向上します。 地域 前述の通り、各リージョンが異なる役割を果たすことができるほか、旧世代と同様に、特に大きなオブジェクトを保管するために使用される Humongous エリアも存在します。オブジェクトがリージョン スペースのサイズの半分を超えると、大きなオブジェクトと見なされます。 (各リージョンのサイズは、パラメータ -XX:G1HeapRegionSize で設定できます。値の範囲は 1MB ~ 32MB で、2 の累乗にする必要があります。) リージョン全体の容量を超える超大型オブジェクトは、N 個の連続する Humongous Region に保存されます。ほとんどの場合、G1 リサイクルでは Humongous Region を古い世代の一部として扱います。 パラメータを有効にする: -XX:+UseG1GC ` パーティション サイズ: -XX:+G1HeapRegionSize 一般的には、この値を徐々に増やすことが推奨されます。サイズが大きくなるにつれて、ガベージがより長く存続し、GC 間隔が長くなりますが、各 GC にかかる時間も長くなります。 最大 GC 一時停止時間: -XX:MaxGCPauseMillis 操作プロセス G1 の操作プロセスは、大きく分けて次の 4 つのステップに分けられます。 初期マーキング: GC ルートに関連付けることができるオブジェクトをマークし、TAMS ポインターの値を変更します。このプロセスではユーザー スレッドを一時停止する必要がありますが、かかる時間は非常に短くなります。 TAMS (Top at Mark Start): 次の同時マーキングが実行されると、ユーザー スレッドは新しいオブジェクトを生成し、これらのオブジェクトはガベージではなく存続可能なオブジェクトであると判断されます。このとき、これらのオブジェクトを保存するための小さな領域を割り当てる必要があります。 同時マーキング: リサイクルするすべてのオブジェクトをスキャンしてマークします。スキャンが完了すると、参照が変更されたオブジェクトが同時に存在し、これらのオブジェクトは見逃されます。これらの見逃されたオブジェクトは、SATB アルゴリズムによって解決されます。 SATB (snapshot-at-the-beginning): スナップショットと同様に、現在のエリアのスナップショットが保存され、最終的なマーキング プロセス中に比較されて、不足している項目が再度マークされているかどうかが確認されます (これについては次の記事で詳しく説明します)。 最終マーキング: すべてのユーザー スレッドを一時停止し、以前に見逃されたオブジェクトをマークします。 ライブデータのカウントと排出:地域の統計を更新し、各地域のリサイクル値をソートし、ユーザーが設定した一時停止時間に基づいてリサイクル計画を策定し、リサイクルする地域を自由に選択できます。リサイクルする必要があるリージョンを空のリージョン領域にコピーし、元のリージョン領域全体をクリアします。これにはオブジェクトの移動も含まれるため、すべてのユーザー スレッドを一時停止し、複数のコレクター スレッドで完了する必要があります。 特徴: 並列性と同時実行性: G1 は、複数の CPU (CPU または CPU コア) を使用して Stop-The-World の停止時間を短縮し、マルチ CPU およびマルチコア環境のハードウェアの利点を最大限に活用できます。他のコレクター G1 コレクターは、GC アクションが元々 Java スレッドの実行を一時停止する必要があったとしても、Java プログラムが並行して実行を継続できるようにします。 世代別コレクション: 他のコレクターと同様に、世代の概念は G1 でも保持されます。 G1は他のコレクターの協力なしにGCヒープ全体を独立して管理できるが、異なるアプローチを採用することもできる。 新しく作成されたオブジェクトと、一定期間存続し、複数の GC を生き延びた古いオブジェクトを処理して、より良いコレクション結果を取得します。 スペース統合: CMS の「マークスイープ」アルゴリズムとは異なり、G1 は全体として「マークコンパクト」アルゴリズムに基づいて実装され、ローカル (2 つのリージョン間) では「コピー」アルゴリズムに基づいて実装されたコレクターです。ただし、どちらのアルゴリズムも、G1 が操作中にメモリ空間の断片化を生成せず、コレクション後に通常の使用可能なメモリを提供できることを意味します。この機能は、プログラムを長期間実行する場合に役立ちます。大きなオブジェクトを割り当てる場合、連続したメモリ領域を見つけることができないため、次の GC は事前にトリガーされません。 一時停止時間の追求: -XX:MaxGCPauseMillis は、目標の最大一時停止時間を指定します。 G1 は、この目標時間を達成するために、新世代と旧世代の比率、ヒープ サイズ、およびプロモーション期間を調整しようとします。 このガベージ コレクターは、数百 GB のヒープ領域を回復するのに適しています。一般的に言えば、G1とCMSのバランスポイントは6〜8Gです。 G1 は、メモリが大きい場合にのみ有利になります。 |
<<: クラウドコンピューティングの統合によりモバイルアプリのパフォーマンスを向上させる方法
>>: 宿題ヘルパー Kubernetes ネイティブ スケジューラ最適化の練習
概要: Jiandan.com で興味深い記事を見つけ、以下の返信を見てみました。突然、感情的なデザ...
「インテルと中国聯通は、MEC エッジ コンピューティングとビデオの組み合わせに関する本格的なコラボ...
Creanova ( Oy Creanova Hosting Solutions Ltd. ) は、...
Hostvn は主にベトナム VPS (ベトナム クラウド サーバー)、ベトナム サーバー レンタル...
【51CTO.comオリジナル記事】はじめにインターネット金融が急速に発展するにつれ、データ量の爆発...
budgetvm は、生涯 25% の特別割引でサーバーをリリースしました。オプションのデータ セン...
Hostwindsは2008年に設立されたアメリカのサーバー会社です。cpanelパネルをベースにし...
「顧客の成功」という概念は古くから存在しています。 Wikipedia によると、カスタマー サクセ...
PacificRack は、第一弾のブラックフライデー プロモーションを先導しました。ハイブリッド ...
多くの場合、Baidu の入札者はセグメント化された期間分析を実行しません。実際、入札コストは毎分毎...
電力システムを仮想化することで、企業は柔軟性を獲得し、メンテナンスを削減し、さらには余剰電力を販売し...
9月17日は「WeChatがサードパーティリンクを全面的に開放する」日になるという噂があったが、この...
周知のとおり、電子商取引の活発な発展は、SEO 業界の促進に重要な役割を果たしてきました。このような...
最近、SEO蘇州ブログを読んだ多くの友人から、記事の中でウェブサイトアーキテクチャという用語が何度も...
クラウド サーバーと仮想ホストは名前が非常に似ているため、多くの企業はそれらの違いを理解していません...