ガベージクリーニングは必須 - 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の検索アルゴリズムを評価する研究開発チームを設立、創設者が戦いを監督

ブログ    
ブログ    
ブログ    

推薦する

今後 10 年間で 21 の新しい仕事が生まれます。あなたに何ができるか見てみましょう。

[[242467]]現在観察できるマクロ経済、政治、人口、社会、文化、ビジネス、テクノロジーの一般...

OpenAIはMicrosoftに対抗するためChatGPTパーソナルアシスタントの発売を計画

6 月 27 日のニュース: わずか半年で、ChatGPT は世界で最も有名なインターネット ブラン...

...

AIの進化:「テクノロジーは2つの道に分かれる」

この記事はWeChatの公開アカウント「Product Second Sister」から転載したもの...

...

人工知能とビッグデータの隠れた危険性とは何でしょうか?

データの不足からデータの豊富さへと、近年利用可能なデータの量は飛躍的に増加し、ビッグデータはどこにで...

ネットワーク攻撃と防御における人工知能の応用と問題分析

サイバー攻撃と防御の対決は絶えず進化とアップグレードを続けています。人工知能は自己学習と適応能力を備...

...

2022年の7つの最先端技術:量子シミュレーションと標的遺伝子治療

北京時間2月23日、ニュースによると、最近「ネイチャー」誌は、2022年に科学分野に大きな影響を与え...

バックトラッキングアルゴリズムの理論的基礎を一緒に復習しましょう。覚えていますか?

[[423516]]バックトラッキング アルゴリズムは、実は非常にわかりにくく、理解するのが困難で...

マインクラフトがAIの街に変身、NPC住民が本物の人間のようにロールプレイ

この立方体の男が、目の前にいる「招かれざる客」の正体について素早く考えている様子を、注意深く見てくだ...

DNS 負荷分散ランキングアルゴリズムの理解

先ほど、DNS 負荷分散の概念をいくつか紹介しました。次に、この負荷分散テクノロジに関連するアルゴリ...