回答:
それはの世話をする古典これはより微妙になり、オブジェクトがまだ参照を保持するときに発生します- GCシステムでメモリリークを持っていることはまだ可能であるが、メモリ管理の問題(使用されなくなったときに割り当てられたメモリがdeacllocatedないばかりではありません)他のオブジェクトに、それらがもはや必要でないときでさえ。
質問を参照してください.NETのメモリリークを持つことができないのはなぜか?StackOverflowの答えです。
xがあります。メモリ割り当てを完全に制御したいが、率直に言って、GCシステムの利点は、通常は必要ないということです。
多くのメモリの問題(ダングリングポインタ、バッファオーバーランなど)とリソースの問題(メモリリーク、その他のリソースリーク)があります。ガベージコレクターは次の処理を行います。
ポインター演算を許可しない言語は、次の処理を行います。
どこからでもメモリ/リソースへの参照を削除するのを忘れたリソース問題の他のケースを解決できないため、GCでメモリリークが発生する可能性があります(例外オブジェクトは、気付いていない多くのものを参照する場合に特に注目されます)。
GCはファイナライザ(デストラクタ)を使用してメモリ以外のリソースを解放するのに役立ちますが、非決定論的な遅延でこれらのリソースを解放します。これは、ファイルやネットワークソケットなどのリソースには適切でないことがよくあります。この種のリソースの問題を処理するには、C#のステートメント、C ++のRAIIイディオム、またはJava 7で構文を試す最新の拡張機能を使用するなど、スコープ付きリソースの言語構成が必要です。 。
正確なガベージコレクターを実行できるようにするには、ポインターの計算を許可せず、数値からアドレスを作成する必要があります。コンパクト化のようないくつかの便利な最適化は、正確なコレクターでのみ実装できます(参照が何であるかが確実にわかる場合にのみオブジェクトを移動できるため、参照を更新できます。C/ C ++ではそれを実行できません)。
ガベージコレクションはメモリに適しています。大量のメモリがある場合、なぜすべてのバイトをクリーンアップするのですか?GCは通常「メモリプレッシャー」に応答し、必要に応じてクリーンアップします。これは記憶にとって良いことです。ただし、非メモリリソース(ファイルハンドル、データベース接続、ロック)を保持するオブジェクトがある場合、メモリプレッシャーがGCをトリガーするまで待機すると、そのリソースを長く保持しすぎることになります。これらのリソースには別のアプローチが必要です。これは、参照カウントがゼロに達したときに確定的に解放される参照カウント共有リソース、または.NETの使用/破棄アプローチを意味する場合があります。
GCシステムは、実行中のプログラムのメモリの使用を最適化しようとするソフトウェアです。
GSシステムは、フレームワーク(JVM / .NET)のコンポーネントであり、コンポーネントの役割を果たします。
処理の特定のポイントの後で、アプリケーションが必要としないと予測した一部のオブジェクトのメモリを解放できます。
.NETでは、一部の.NETネイティブオブジェクトに対してのみメモリを解放でき、MS COMオブジェクトに対しては解放できません。
.NETで使用されるMS COMオブジェクトは明示的に解放する必要があります。
参照: