ホームページ  >  記事  >  Java  >  Java における GC ガベージ コレクターの重要性と、GC との相互作用の簡単な分析

Java における GC ガベージ コレクターの重要性と、GC との相互作用の簡単な分析

高洛峰
高洛峰オリジナル
2017-01-17 15:43:341117ブラウズ

オブジェクトは new を使用して作成されますが、オブジェクトが占有しているメモリをリサイクルするための対応する削除操作はありません。オブジェクトの使用が完了したら、単にオブジェクトの参照を停止します。参照を別のオブジェクトまたは null を指すように変更するか、メソッドから戻り、メソッドのローカル変数が存在しないようにします。したがって、これらのローカル変数への参照が作成されます。変数はオブジェクトを指していません。参照されなくなったオブジェクトはガベージと呼ばれ、これらのオブジェクトを見つけてリサイクルするプロセスはガベージ コレクションと呼ばれます。Java 仮想マシンはガベージ コレクションを使用して、参照されたオブジェクトがメモリ内に確実に残るようにします。実行中のコード内の参照を通じて到達できない by オブジェクトは解放されます。これは強力な保証です。ルート参照 (つまり、実行中のコードで直接アクセスできる参照) から始まる参照チェーンをたどってオブジェクトに到達できる場合、そのオブジェクトはリサイクルされません。

要するに、どの実行可能コードからもオブジェクトに到達できない場合、そのオブジェクトが占有しているスペースを再利用することができます。 「できる」という言葉を使用しているのは、メモリ領域がリサイクルされるかどうかはガベージ コレクタによって決定されるためです。通常、ガベージ コレクタは、より多くのメモリ領域が必要な場合、またはメモリ オーバーフローの実行を回避するためにのみメモリ領域をリサイクルします。ただし、プログラムはメモリ オーバーフローなしで終了する場合や、メモリ オーバーフローに近づいていない場合でも終了する場合があるため、ガベージ コレクションを実行する必要がまったくない場合もあります。現在実行されているすべてのメソッドで、オブジェクトへの参照を含む変数がなく、これらの変数を起点として、参照チェーンに沿ったどのフィールドまたは配列要素にもこのオブジェクトへの参照が見つからない場合、そのオブジェクトは「到達不能」であると言えます。 。

ガベージコレクションは、ぶら下がり参照について心配する必要がないことを意味します。プログラマがオブジェクトを削除するタイミングを直接制御できるシステムでは、プログラマは、他のオブジェクトによってまだ参照されているオブジェクトを削除できます。プログラマがそのようなオブジェクトを削除すると、削除されたオブジェクトをまだ参照している参照も削除されます。 . は、オペレーティング システムが割り当て可能であると認識している (実際には領域が解放されている) メモリ領域を参照するため、ダングリングになります。システムは、この割り当て可能な領域を新しいオブジェクトに割り当てることができるため、最初にこの領域を指していた参照は、実際には予期していたものとはまったく異なるオブジェクトを取得します。この場合、プログラムがこの空間に保存されている値を使用し、それらが属していないオブジェクトとして操作すると、予期せぬ災害が発生する可能性があります。ガベージ コレクションは、まだ参照されているすべてのオブジェクトがガベージ コレクションとして扱われないため、それらのオブジェクトが占有している領域を解放できないため、ダングリング参照の問題を解決します。ガベージ コレクションは、同じオブジェクトを誤って複数回削除するという、災害につながる可能性がある問題も解決します。 ガベージ オブジェクトのリサイクルには私たちの介入は必要ありませんが、ガベージのリサイクルには特定のシステム リソースが占有されます。大量のオブジェクトの作成とリサイクルは、タイムクリティカルなアプリケーションに混乱をもたらす可能性があるため、このようなシステムを設計するときは、リサイクルされるゴミの量を減らすために、作成されるオブジェクトの数を慎重に扱う必要があります。

ガベージコレクションは、新しいオブジェクトを作成するためのスペースが常にメモリ内にあることを保証しません。たとえば、オブジェクトを作成し続けてリストに追加する場合、新しいオブジェクトを作成するための十分なスペースがなく、参照されていないオブジェクトがない場合、新しいオブジェクトは作成できません。上記のリストに不要になったオブジェクトへの参照を保持させると、メモリ リークが発生します。ガベージ コレクションは、多くの (すべてではない) メモリ割り当ての問題を解決します。

ガベージ コレクターとの対話

Java 言語自体には空きオブジェクトを破棄する明示的な方法がありませんが、ガベージ コレクターを直接呼び出すことで、使用されなくなったオブジェクトを見つけることができます。 Runtime クラスと system クラスのいくつかの便利なメソッドを使用すると、ガベージ コレクターを呼び出したり、実行するすべてのファイナライザーの実行を要求したり、現在のメモリ状態を表示したりすることができます:

.public void gc Q: このメソッドは Java 仮想マシンを要求しますエネルギーを消費する 使用されなくなったオブジェクトをリサイクルして、これらのオブジェクトが占有しているメモリを再利用できるようにすること。

.public void runFinalization(): このメソッドは、次のファイナライザーを実行するためにエネルギーを消費するように Java 仮想マシンに要求します: 到達不可能であることが判明したが、ファイナライザーがまだ実行されていないオブジェクト。

"public long freememory(): 利用可能なシステムメモリの推定バイト数を返します。

·public long total Memory (): システムメモリの総バイト数を返します。

.public long maxmemory: Java を返します。仮想マシン 使用可能なシステム メモリの最大バイト数。オペレーティング システムに Java 仮想マシンのメモリ使用制限がない場合、Java にはシステムの最大メモリを設定するメソッドがありません。一般に、Java 仮想マシンのこの値は、コマンド ラインまたはその他の構成オプション

を通じて設定されます。

上記のメソッドを呼び出すには、静的メソッド Runtime.getRuntime を通じて現在の Runtime オブジェクトへの参照を取得する必要があります。システム クラスは、静的な gc メソッドと runFinalization メソッドをサポートしており、これらは現在の Runt-ime オブジェクトの対応するメソッドを呼び出します。つまり、System.gc() メソッドと Runtime.getRuntime().gc() メソッドは同等です。

Runtime.gc() メソッドを呼び出すとき、収集するガベージが存在しない可能性があり、すべてのガベージ コレクターがオンデマンドでリサイクル可能なオブジェクトを検出できるわけではないため、ガベージ コレクターは追加のメモリを解放できない場合があります。したがって、ガベージ コレクターを呼び出しても効果がない可能性があります。ただし、特にガベージ コレクションのオーバーヘッドが影響する可能性がある時間重視のアプリケーションでは、多数のオブジェクトを作成する前に Runtime.gc() メソッドを呼び出すことをお勧めします。これを行うことには 2 つの潜在的な利点があります。1 つ目は、アプリケーションの実行前にできるだけ多くのメモリを取得できること、2 つ目は、タスクの実行中にガベージ コレクターが実行される可能性を低減できることです。次のメソッドは、実行時に解放できるすべての領域をアクティブに解放します。

public static vo记ful1GC(){
 
Runtime rt=Runtime.getRuntime();
 
long isFree=rt.freeMemory ();
 
long wasFree;
 
do{
 
wasFree=isFree;
 
rt.runFinalization ();
 
rt.gc();
 
isFree二rt.freeMemory();
 
}while (isFree>wasFree);
 
}

このメソッドは継続的に runFinalization メソッドと gc メソッドを呼び出すことで、freememory の値が増加し続けます。空きメモリの量が増加しなくなった場合、このメソッドのループは終了します。

finalizeメソッドはガベージコレクターによって非同期で呼び出される為、通常はrunFinalizationメソッドを呼び出す必要はありません。場合によっては、finalize メソッドで再利用できる項目のリソースが使い果たされた場合など、run-Finalization を呼び出してできるだけ多くのファイナライズを強制すると便利です。ただし、ファイナライズを待っているオブジェクトがこのリソースを使用しているという保証はないため、runFinalization は効果がない可能性があることに注意してください。

fullGc アプローチは、ほとんどのアプリケーションにとって攻撃的すぎます。ガベージ コレクションを強制する必要がある特殊なケースでは、system.gc メソッドを 1 回呼び出すだけで、利用可能なガベージのすべてではないにしても、ほとんどが収集されるため、呼び出しを繰り返すと、多くのシステムでガベージ コレクションの出力が低下します。このような繰り返しの呼び出しは非生産的です。

Java における GC ガベージ コレクターの意味と GC との相互作用に関する記事をさらに詳しく知りたい場合は、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。