ガベージコレクターでできることとできないこと


8

GCはすべてのメモリ管理の問題(メモリリーク)を処理しますか?

GCにコードの一部を制御させたくない場合はありますか?


収集する必要がありますが、収集することはできません。
2010年

回答:


10

それはの世話をする古典これはより微妙になり、オブジェクトがまだ参照を保持するときに発生します- GCシステムでメモリリークを持っていることはまだ可能であるが、メモリ管理の問題(使用されなくなったときに割り当てられたメモリがdeacllocatedないばかりではありません)他のオブジェクトに、それらがもはや必要でないときでさえ。

質問を参照してください.NETのメモリリークを持つことができないのはなぜか?StackOverflowの答えです。

xがあります。メモリ割り当てを完全に制御したいが、率直に言って、GCシステムの利点は、通常は必要ないということです。


1
ペナルティが高すぎると考えられる唯一の状況は、ハイエンドグラフィックスなどの限られたメモリを介して大量のデータを非常に迅速に移動するシステム、または組み込みコントローラーなど、そもそも非常に限られたメモリを備えたシステムです。
ワールドエンジニア

@WorldEngineer-True。これが.NETがオブジェクトを固定し、メモリのセクションをより詳細に制御できるようにする理由です。
2010年

ハイパフォーマンスコンピューティング、低レイテンシトレーディングシステムなどはすべて、GCの制御が大好きです:-)
Martijn Verburg

ああ、彼らはそれをうまく調整することができました。一時停止を小さくし、GC(増分および並行GC)に費やす時間を制限することに特化したハイエンドGCのクラス全体が、本番環境対応の候補として用意されています。しかし、明らかにそれでもそれらの一部にとっては十分ではありません(それが妥当かどうかはわかりません)。そのため、JITコンパイルとともに残します。

@SamSaffronがこのリンクをTwitterに投稿し、GCの明示的な動作を利用してアドバンテージを得た(ab)marcgravell.blogspot.com/2011/10/assault-by-gc.html
Carlo Kuip

2

多くのメモリの問題(ダングリングポインタ、バッファオーバーランなど)とリソースの問題(メモリリーク、その他のリソースリーク)があります。ガベージコレクターは次の処理を行います。

  • ぶら下がりポインタ
  • 主にメモリリーク
  • 部分的に他のリソースリーク

ポインター演算を許可しない言語は、次の処理を行います。

  • バッファオーバーランおよびその他の無効なポインタのケース

どこからでもメモリ/リソースへの参照を削除するのを忘れたリソース問題の他のケースを解決できないため、GCでメモリリークが発生する可能性があります(例外オブジェクトは、気付いていない多くのものを参照する場合に特に注目されます)。

GCはファイナライザ(デストラクタ)を使用してメモリ以外のリソースを解放するのに役立ちますが、非決定論的な遅延でこれらのリソースを解放します。これは、ファイルやネットワークソケットなどのリソースには適切でないことがよくあります。この種のリソースの問題を処理するには、C#のステートメント、C ++のRAIIイディオム、またはJava 7で構文を試す最新の拡張機能を使用するなど、スコープ付きリソースの言語構成が必要です。 。

正確なガベージコレクターを実行できるようにするには、ポインターの計算を許可せず、数値からアドレスを作成する必要があります。コンパクト化のようないくつかの便利な最適化は、正確なコレクターでのみ実装できます(参照が何であるかが確実にわかる場合にのみオブジェクトを移動できるため、参照を更新できます。C/ C ++ではそれを実行できません)。


1

ガベージコレクションはメモリに適しています。大量のメモリがある場合、なぜすべてのバイトをクリーンアップするのですか?GCは通常「メモリプレッシャー」に応答し、必要に応じてクリーンアップします。これは記憶にとって良いことです。ただし、非メモリリソース(ファイルハンドル、データベース接続、ロック)を保持するオブジェクトがある場合、メモリプレッシャーがGCをトリガーするまで待機すると、そのリソースを長く保持しすぎることになります。これらのリソースには別のアプローチが必要です。これは、参照カウントがゼロに達したときに確定的に解放される参照カウント共有リソース、または.NETの使用/破棄アプローチを意味する場合があります。


0

GCシステムは、実行中のプログラムのメモリの使用を最適化しようとするソフトウェアです。

GSシステムは、フレームワーク(JVM / .NET)のコンポーネントであり、コンポーネントの役割を果たします。

処理の特定のポイントの後で、アプリケーションが必要としないと予測した一部のオブジェクトのメモリを解放できます。

.NETでは、一部の.NETネイティブオブジェクトに対してのみメモリを解放でき、MS COMオブジェクトに対しては解放できません。

.NETで使用されるMS COMオブジェクトは明示的に解放する必要があります。

参照:

MSDN:ガベージコレクション

ウィキペディア:ガベージコレクション


降格された理由-フィードバックを歓迎しますか?
NoChance、2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.