ガベージクリーニングは必須 - Java ガベージコレクションアルゴリズム

ガベージクリーニングは必須 - Java ガベージコレクションアルゴリズム

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の検索アルゴリズムを評価する研究開発チームを設立、創設者が戦いを監督

ブログ    
ブログ    
ブログ    

推薦する

「ビッグモデルは基本的に2つのファイルです!」テスラの元AIディレクターが一般向けに1時間にわたるLLMポピュラーサイエンスを披露

テスラの元AIディレクター、アンドレイ・カルパシー氏の新しいチュートリアルが話題になっている。今回、...

...

...

...

...

機械学習の新たな嵐: ML モデルを使用して住宅価格を予測する方法とは?

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

より強力なLlama 2はオープンソースであり、商用目的で直接使用できます。一夜にして、ビッグモデルの風景は変わりました。

一夜にして、ビッグモデルの状況は再び劇的に変化しました。写真Llama は常に AI コミュニティで...

機密コンピューティングが生成型AIの導入を確実にする方法

生成 AI は、新しい製品、ビジネス、業界、さらには新しい経済に情報を提供することができます。しかし...

労働者は一生懸命働かなければなりません! AI仮想人間が労働力に参入しようとしている

[[413812]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...

人工知能時代のセキュリティ専門職とは?

人工知能の時代におけるセキュリティ専門職は何かという問題は、徐々に人々が直面しなければならない問題に...

OpenAI の新しい論文が GAN を破り SOTA に到達!この圧倒的な拡散モデルは単なる仕掛けなのか、それとも本物なのか?

最近またFaceAPPが人気になってきているので、編集者もダウンロードして試してみました。大丈夫です...

...

Ruilai Wisdom、安全なAIインフラの構築に注力するためシリーズAで3億人民元超の資金調達を完了

10月28日、北京瑞来智能科技有限公司(以下「瑞来智能」)は、3億人民元を超えるAラウンド資金調達を...

顔認識技術の応用に関する法的規制

新興技術の発展とビジネス、公共福祉、社会統治などの分野におけるその応用をどのように促進、保護、規制す...

...