1. Javaガベージコレクションアルゴリズムの核となる考え方 Java 言語は、使用中のオブジェクトを追跡し、使用されなくなった (参照されていない) オブジェクトを検出してリサイクルするためのガベージ コレクション メカニズムを確立します。 Java ガベージ コレクション アルゴリズムは、動的なメモリ割り当てで発生する可能性のある 2 つの危険、つまり過剰なメモリ ガベージによるメモリ枯渇と、不適切なメモリ解放による不正なメモリ参照を効果的に防ぐことができます。 ガベージ コレクション アルゴリズムの核となる考え方は、仮想マシンの使用可能なメモリ空間、つまりヒープ空間内のオブジェクトを識別することです。オブジェクトが参照されている場合、それはライブ オブジェクトと呼ばれます。逆に、オブジェクトが参照されなくなった場合はガベージ オブジェクトであり、占有されている空間は再割り当てのために再利用できます。ガベージ コレクション アルゴリズムの選択とガベージ コレクション システム パラメータの適切な調整はシステムのパフォーマンスに直接影響するため、開発者はより深い理解を持つ必要があります。 2. メインGC(ガベージコレクター)を起動する条件 JVM はセカンダリ GC を非常に頻繁に実行しますが、このタイプの GC は所要時間が非常に短いため、システムへの影響はほとんどありません。メジャー GC のトリガー条件はシステムに大きな影響を与えるため、より注意を払う必要があります。一般に、メジャー GC をトリガーする条件は 2 つあります。 ①アプリケーションがアイドル状態、つまりアプリケーションスレッドが実行されていない場合、GC が呼び出されます。 GC は最も優先度の高いスレッドで実行されるため、次の条件を除き、アプリケーションがビジー状態のときは GC スレッドは呼び出されません。 ②Javaヒープメモリが不足するとGCが呼び出されます。アプリケーション スレッドが実行中で、実行プロセス中に新しいオブジェクトを作成するときに、その時点でメモリ領域が不足していると、JVM は強制的に GC スレッドを呼び出して、新しい割り当てのためにメモリを再利用します。 1 回の GC でメモリ割り当て要件を満たすことができない場合、JVM はさらに 2 回の GC 試行を実行します。それでも要件が満たされない場合、JVM は「メモリ不足」エラーを報告し、Java アプリケーションは停止します。 メジャー GC を実行するかどうかは JVM がシステム環境に基づいて決定し、システム環境は常に変化するため、メジャー GC の動作は不確実であり、いつ発生するかを予測することはできません。ただし、長時間実行されるアプリケーションの場合、メジャー GC が繰り返し実行されることは確かです。 3. GCオーバーヘッドを削減する対策 上記の GC メカニズムによれば、プログラムの実行はシステム環境の変化に直接影響し、それによって GC のトリガーに影響します。 GC の特性を踏まえた設計やコーディングを行わないと、メモリ常駐などの一連の悪影響が発生します。これらの影響を回避するための基本原則は、ガベージを可能な限り削減し、GC プロセスのオーバーヘッドを削減することです。具体的な対策としては、以下のようなものがあります。 (1)System.gc()を明示的に呼び出さない この関数は、JVM がメジャー GC を実行することを提案します。これは提案に過ぎず、必須ではありませんが、多くの場合、メジャー GC がトリガーされ、メジャー GC の頻度、つまり断続的な一時停止の回数が増加します。 (2)一時的な物の使用を最小限に抑える 一時オブジェクトは、関数呼び出しから抜け出すとガベージになります。一時変数の使用を減らすことは、ガベージの生成を減らすことと同じであり、それによって、上記の 2 番目のトリガー条件が発生する時間が長くなり、メジャー GC の可能性が減少します。 (3)オブジェクトが使用されていない場合は、明示的にNullに設定する必要がある 一般的に、Null のオブジェクトはガベージとして扱われるため、未使用のオブジェクトを明示的に Null に設定すると、GC コレクターがガベージを識別しやすくなり、GC の効率が向上します。 (4) 文字列を蓄積するためにStringの代わりにStringBufferを使用するようにしてください(詳細については、別のブログ記事「JavaにおけるStringとStringBuffer」を参照してください) String は固定長の文字列オブジェクトであるため、String オブジェクトが蓄積されると、1 つの String オブジェクトに拡張されるのではなく、新しい String オブジェクトが作成されます。たとえば、Str5=Str1+Str2+Str3+Str4 です。このステートメントの実行中に複数のガベージ オブジェクトが生成されます。これは、"+" 演算ごとに新しい String オブジェクトを作成する必要があるためです。ただし、これらの遷移オブジェクトはシステムにとって実用的な意味はなく、ガベージを追加するだけです。この状況を回避するには、StringBuffer を使用して文字列を蓄積します。StringBuffer は可変長であるため、元のベースで拡張され、中間オブジェクトは生成されません。 (5)IntやLongなどの基本型を使用できる場合は、IntegerやLongオブジェクトは必要ありません。 基本型変数は、対応するオブジェクトよりもはるかに少ないメモリ リソースを占有します。必要がない場合は、基本変数を使用することをお勧めします。 (6)静的オブジェクト変数をできるだけ使わない 静的変数はグローバル変数であり、GC によって回収されません。常にメモリを占有します。 (7)分散オブジェクトの作成または削除時刻 短期間に大量の新しいオブジェクト、特に大きなオブジェクトを作成すると、突然大量のメモリが必要になります。このような状況に直面すると、JVM はメジャー GC を実行してメモリを再利用するか、メモリのフラグメントを統合することしかできず、メジャー GC の頻度が増加します。集中的にオブジェクトを削除する場合も、同じ原則が適用されます。これにより、大量のガベージ オブジェクトが突然出現し、空き領域が必然的に減少し、次に新しいオブジェクトが作成されるときにメジャー GC が強制される可能性が大幅に高まります。 Java ガベージコレクションアルゴリズムに基づく GC メカニズムは、メモリ管理における Java のエラーを効果的に削減すると言えます。 |
<<: 古典的なJavaアルゴリズムの筆記試験問題を分析する
>>: GoogleはBingの検索アルゴリズムを評価する研究開発チームを設立、創設者が戦いを監督
脳の神経回路を研究するのは簡単ではありません。なぜなら、現時点では、すべてのニューロン、シナプス、そ...
今日は、子供たちにプログラミングを教えるということについての私たちの考えをいくつか共有したいと思いま...
この記事の著者である Cody Marie Wild は、機械学習分野のデータ サイエンティスト (...
前回のレビュー「データ サイエンティストが 95% の時間に使用する 11 個の基本チャート」に続き...
GPT-4 が最近少し「怠惰」になっていることにお気づきでしょうか。現在、GPT-4 は常に特定のタ...
IT自動化と人工知能技術の進歩と発展により、IT担当者の働き方は大きく変化しました。今年に入って新...
2月8日、ホワイトハウス大統領府は最新の改訂版「重要かつ新興の技術」リスト(CETリスト)を発表しま...
人工知能は、あらゆる種類の企業のバックオフィスに大きく浸透しつつあります。バックオフィスは、ビジネス...
オープンソースの奇跡が再び起こりました。Mistral AI が初のオープンソース MoE 大規模モ...