ホームページ >Java >&#&チュートリアル >Java パフォーマンス最適化のための一般的なガベージ コレクターは何ですか?

Java パフォーマンス最適化のための一般的なガベージ コレクターは何ですか?

王林
王林転載
2023-04-20 11:40:121218ブラウズ

一般的なガベージ コレクターとアルゴリズム

私が提供した他の 2 つの記事を通じて、ガベージ コレクターについて多くのことを学ぶことができると思います。本当に注意を払う必要があり、使用する可能性があるガベージ コレクターは、次の 4 つのタイプです。

serial シリアル ガベージ コレクター

仮想タイプの client## の場合# マシンまたは シングルコア サーバーでは、このガベージ コレクターがデフォルトのガベージ コレクターになります。マイナー GC であってもフル GC であっても、すべてのアプリケーション スレッドは一時停止されます。 Serial Old は旧世代で使用され、これもシングルスレッドの旧世代バージョンです。

クライアント型仮想マシンは、コンパイルの種類がクライアントとサーバーに分かれていると前述しましたが、JVM はクライアント コンパイラ (シングル スレッド) を通じてコードを JVM が認識できるバイトコードにコンパイルします。

は、次のフラグで表すことができます:

    -XX:+UseSerialGC

並列マルチスレッド ガベージ コレクター

サーバー タイプの仮想マシンまたはマルチスレッド サーバー上、jdk8 のデフォルト 使用するガベージ コレクターのタイプ。

マイナー GC とフル GC はどちらもマルチスレッドを使用してガベージを収集します。どちらのタイプの GC もアプリケーション スレッドを一時停止させます。ただし、スループットが高く、応答時間に対する過度の要件がない場合には、ガベージ コレクターとして最適です。

次のフラグでステータスを確認できます:

若い世代:

-XX:+UseParallelGC

古い世代:

-XX:+UseParallelOldGC

CMS コレクター

その独自の設計は、リサイクル中にシリアルおよびパラレルコレクターによって引き起こされる長期的なシステムラグを軽減することです。

マイナー GC が発生すると、すべてのアプリケーション スレッドも一時停止されます。違いは、若い世代ではパラレルまたはシリアルを使用せず、CMS

ParNew に特別に適合した若い世代のコレクターを使用することです。

これは、次の兆候から確認できます。

-XX:+UseParNewGC

CMS は、フル GC が発生したときにすべてのアプリケーション スレッドを一時停止しなくなりましたが、同時に実行するためにマルチスレッドを使用します。アプリケーションのスレッドに応じて、使用されなくなったオブジェクトをクリーンアップします。これにより、CMS ガベージ コレクターの一時停止時間が大幅に短縮されます。パレルコレクターと比較すると非常に明白です。

欠点:

  • アプリケーション スレッドの実行中に gc スレッドが継続的にヒープをスキャンできるようにするために、CMS はより多くの CPU リソースを占有する必要があります。空間。

  • メモリは圧縮および整理されず、メモリの断片化が発生します。

十分な CPU リソースがない場合、またはメモリの断片化が限界に達した場合、

serial コレクターに縮退します。

は、次のフラグを通じて表示できます。

-XX:+UseConcMarkSweepGC

G1 コレクター

は、

ガベージ優先コレクター ( ガベージ初め)。

元の設計は、非常に大きなヒープ (4GB) を処理するときに発生する遅延を最小限に抑えることです。 G1 は引き続き世代コレクタに属しますが、

論理世代である点が異なります。 G1 はヒープ領域をいくつかの領域 (リージョン) に分割します。新世代のガベージ コレクションでは、すべてのアプリケーション スレッドを一時停止して、生き残ったオブジェクトを旧世代または Survivor 領域にコピーする方法が引き続き使用されます。旧世代も多くのエリアに分割されており、G1 コレクターはオブジェクトをあるエリアから別のエリアにコピーすることでクリーンアップ作業を完了します。これにより、CMS のメモリ断片化の問題が解決されます。

CMS と同様に、G1 もコンカレント コレクターであり、古い世代でフル GC が発生した場合、バックグラウンド スレッドはアプリケーション スレッドを一時停止せずにリサイクル作業を完了します。

次のロゴを参照してください:

-XX:+UseG1GC

実際、上記の内容は簡単な説明です。実際の実装の詳細については、冒頭の記事を参照してください。 。

明示的なガベージ コレクション

ここで説明する明示的なガベージ コレクションは、実際には、以下に示すように、手動でトリガーされるガベージ コレクションを指します。

System.gc;

これは、方法です。 jvm を制御して gc を持つように強制します。このメソッドをガベージ コレクションに使用することはいかなる場合でも推奨されません。

この仕様を使用すると、CMS や G1 など、どのようなガベージ コレクターであっても、Full GC が発生し、すべてのアプリケーション スレッドが同時に停止するため、長時間のラグが発生します。時間。

#例外:

#パフォーマンス分析、テスト
  • #ヒープ分析

  • 上記の状況では、System.gc を呼び出すと、現在のアプリケーションの問題を分析しやすくなります。

以上がJava パフォーマンス最適化のための一般的なガベージ コレクターは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。