オブジェクトは新規を使用して作成されますが、オブジェクトが占めるメモリをリサイクルする対応する削除操作はありません。オブジェクトの使用を完了すると、そのオブジェクトを参照するのを停止します。参照を変更して、別のオブジェクトまたはnullを指すように変更します。または、メソッドのローカル変数が存在しなくなるようにメソッドから戻り、これらのローカル変数への参照がオブジェクトを指していないようにします。もはや参照されていないオブジェクトは、ガベージと呼ばれます。これらのオブジェクトを見つけてリサイクルするプロセスは、ガベージコレクションoと呼ばれます
Java Virtual MachinesはGarbage Collectionを使用して、参照されるオブジェクトがメモリに保持され、実行コードの参照を通じて到達できないオブジェクトで占有されているストレージスペースを解放します。これは、ルート参照から始まる参照チェーン(つまり、実行コードで直接アクセスできる参照)からオブジェクトがリサイクルされない場合、強力な保証です。
要するに、実行可能なコードからオブジェクトに到達できない場合、それが取るスペースをリサイクルできます。メモリスペースがリサイクルされているかどうかは、ゴミコレクターによって決定されるため、「can」という言葉を使用することに注意してください。一般に、ゴミコレクターは、より多くのメモリスペースが必要な場合にのみ実行されるか、メモリオーバーフローを回避します。ただし、プログラムはメモリオーバーフローなしで、またはメモリオーバーフローに近い場合でも終了する可能性があるため、ガベージコレクションはまったく必要ない場合があります。現在実行されているすべてのメソッドで、すべての変数がオブジェクトへの参照が含まれており、これらの変数から始まる場合、このオブジェクトへの参照は、参照チェーンに沿ったすべてのドメインまたは配列要素で見つけることができない場合、オブジェクトは「到達不能」であると言います。
ゴミリサイクルは、ぶら下がっている参照を心配する必要がないことを意味します。プログラマーがオブジェクトを削除したときに直接制御できるシステムでは、プログラマーは他のオブジェクトがまだ参照しているオブジェクトを削除できます。プログラマーがそのようなオブジェクトを削除すると、削除されたオブジェクトを参照している参照は、沈黙を参照するために無効になります。
システムは、それが割り当て可能なメモリスペースであると考えています(実際、スペースはリリースされています)。システムは、この割り当て可能なスペースを新しいオブジェクトに割り当てることができます。そのため、元々スペースを指し示しているのは、実際に予想とはまったく異なるオブジェクトをもたらします。この場合、プログラムがこのスペースに保存された値を使用し、属していないオブジェクトとして操作する場合、予測不可能な災害が発生する可能性があります。ガベージコレクションは、まだ参照されているすべてのオブジェクトがガベージコレクションとして扱われないため、占有するスペースを解放できないため、私たちの吊り下げの参照の問題を解決します。 Garbage Collectionは、同じオブジェクトを複数回誤って削除する問題も解決します。この問題は災害を引き起こす可能性があります。ゴミオブジェクトのリサイクルは介入を必要としませんが、リサイクルガベージは一定量のシステムリソースを占有します。多数のオブジェクトの作成とリサイクルは、時間型のアプリケーションに干渉する可能性があるため、このようなシステムを設計するときは、リサイクルするゴミの量を減らすために作成されたオブジェクトの数を注意深く扱う必要があります。
Garbage Collectionは、メモリに新しいオブジェクトを作成するスペースが常にあることを保証するものではありません。たとえば、オブジェクトを作成し続けてリストに配置し続けると、新しいオブジェクトを作成するのに十分なスペースがなく、参照されていないオブジェクトがない場合、新しいオブジェクトを作成できなくなります。上記のリストを必要としなくなったオブジェクトへの参照を保持すると、メモリリークが発生します。ガベージコレクションは、多くの(すべてではない)メモリ割り当ての問題を解決します。
ゴミコレクターと対話します
Java言語自体には、アイドルオブジェクトを処分する明示的な方法はありませんが、ガベージコレクターを直接呼び出すことによって使用されなくなったオブジェクトを見つけることができます。ランタイムクラスとシステムクラスのいくつかの便利な方法により、Garbage Collectorを呼び出したり、すべてのファイナライザーを実行したりすることをリクエストしたり、現在のメモリステータスを表示したりすることができます。
.public void gc q:この方法では、これらのオブジェクトが占めているメモリを再利用できるように、使用されなくなったエネルギーリサイクルオブジェクトを使用するようにJava仮想マシンに依頼します。
.public void runfinalization():この方法では、Java仮想マシンに、次のファイナイザーを実行するエネルギーを使用するように依頼します。
「Public Long Freedom():システムメモリ内の利用可能なバイトの推定数を返します。
public Public Long Total Memory():システムメモリのバイトの総数を返します。
.public long maxmemoryo:Java仮想マシンで利用可能なシステムメモリの最大バイト数を返します。オペレーティングシステムがJava仮想マシンにメモリ使用制限がない場合、長い。最大値が返されます。 Javaには、システムの最大メモリを設定する方法はありません。通常、Java仮想マシンは、コマンドラインまたはその他の構成オプションを使用してこの値を設定します。
上記の方法を呼び出すには、静的メソッドruntime.getRuntimeを介して現在のランタイムオブジェクトへの参照を取得する必要があります。システムクラスは、静的GCおよびRunfinalizationメソッドをサポートします。これは、現在のRunt-Imeオブジェクトの対応する方法を呼び出します。言い換えれば、System.gc()はruntime.getRuntime()。gc()メソッドに相当します。
runtime.gc()メソッドを呼び出すと、ゴミコレクターはリサイクルするガベージがない可能性があり、すべてのガベージコレクターがリサイクル可能なオブジェクトをオンデマンドで発見できるわけではないため、余分なメモリを解放できない場合があります。したがって、ゴミコレクターを呼び出すことは何の効果もないかもしれません。ただし、Runtime.gc()メソッドを呼び出すことは、特にガベージコレクションのオーバーヘッドがそれに影響する場合がある時間的に批判的なアプリケーションで、多数のオブジェクトを作成する前に望ましいです。実行には2つの潜在的な利点があります。1つ目は、アプリケーションを実行する前にできるだけ多くのメモリを取得できることです。2つ目は、タスクの実行中にガベージコレクターが実行される可能性を減らすことができることです。次の方法は、実行時にリリースできるすべてのスペースを積極的にリリースします。
public static vo recordful1gc(){runtime rt = runtime.getRuntime(); long isfree = rt.freememory();長く無駄に。 do {wasfree = isfree; rt.runfinalization(); rt.gc(); isfree two rt.freememory(); } while(isfree> wasfree); }この方法は絶えずループしており、フリーメモリの価値は、RunfinalizationとGCメソッドを継続的に呼び出すことで増加し続けています。自由メモリの量が増えなくなった場合、メソッドのループは終了します。
ファイナライズ方法はガベージコレクターによって非同期と呼ばれるため、通常、Runfinalizationメソッドを呼び出す必要はありません。たとえば、たとえば、ファイナライズメソッドによってリサイクルできるリソースが使い果たされる場合、実行ファイナル化を呼び出すことでできるだけ多くの終端を実施することが役立ちます。しかし、終了するのを待っているオブジェクトがこのリソースを使用していることを保証することはできないため、Runfinalizationが効果がない場合があることを忘れないでください。
FullGCメソッドは、ほとんどのアプリケーションでは過激すぎるようです。ごみ収集が必要な特別な場合、たとえ利用可能なすべてのゴミがSystem.GCメソッドへの単一の呼び出しによって収集されたとしても、それはその大部分です。したがって、繰り返されるコールはゴミ収集の出力速度を減らし、多くのシステムでは、これらの繰り返しの呼び出しは出力されます。