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の検索アルゴリズムを評価する研究開発チームを設立、創設者が戦いを監督
1. シーン分類 顔認識:セキュリティ監視認識、顔アクセス制御、有名人の顔、VIP ID認識など。人...
C# はデジタル変換のための中国語アルゴリズムを記述します最近、プロジェクト上の理由により、C# で...
今年12月1日より、物理チャネルでは顔認識技術対策を全面的に導入し、電話ネットワークへのアクセスプロ...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
素晴らしいニュースです! Microsoft が Excel に Python を導入しました。 E...
最近、2020年夏季オリンピックがついに2021年に開幕しました。 [[413267]]現在、我が国...
過去2年間、スマートフォンやモバイル通信ネットワークの発展に伴い、マイクロプロセッサ、センサー、無線...
1 月 20 日、マイクロソフトのグローバル エグゼクティブ バイスプレジデントであるハリー シャム...
[[198507]]誰の生活も金融から独立して存在することはできません。テクノロジーの発展により人々...
大規模言語モデル (LLM) は常識理解やコード生成などのタスクでは大きな進歩を遂げていますが、数学...
本日、チップ業界の大手 Broadcom が VMware を 610 億ドルで買収することを正式に...
[[186458]]機械学習アルゴリズムが「実験室の地震」を予測できるという事実は、間違いなく画期...