2

だから私は毎秒5MBずつメモリを増やすプログラムを持っています。アプリケーションごとに 2GB しか割り当てることができないため、プログラムを開始してから約 5 分後に制限に達し、System.OutOfMemoryException が発生しました。

私は「宿題をやった」(うまくいけば十分です:D)、ブロックの終了後、そのブロック内の変数が破棄されないことを知っています。

最終的には、OutOfMemoryException の発生を防ぐために、各ブロックの後で使用される変数からメモリを自動的に解放する方法が必要です。

PS: このトピックには多くの混乱があることを認識しているため、質問に間違いがあった場合は、お気軽に訂正してください。しかし、ほとんどの場合、この例外を邪魔にならないようにしたいと思います。

編集

さて、奇妙なことが起こりました。プロジェクト全体をデスクトップ (動作しない場所) からラップトップにコピーしました。どうやら、私のラップトップでは問題なく動作します。メモリはほとんど 500 KBps しか増加せず、1 秒後に自動的に解放されます。理由はわかりませんが、まったく同じプロジェクトであり、コードは変更されていません。

なぜこれが起こるのか知っている人はいますか?

4

5 に答える 5

1

ANTS プロファイラーまたは CLRProfiler を使用して、スペースを占有しているオブジェクトと、これらのオブジェクトへの参照を作成および保持しているメソッドを特定します。

于 2012-11-19T09:51:12.757 に答える
1

これらの変数をusing ステートメントで使用し、完了したら GC.Collect()を呼び出します。

于 2012-11-19T09:12:23.867 に答える
1

私の経験では、マネージ コードでメモリ リークを起こす最も一般的な方法は、参照が長時間保持されているか、参照がどのように処理されているかを理解していないことです。ライブ参照は、コードがどれだけうまく処理されていても、ガベージ コレクションを防ぎます。

これは、リークしているものとそれらの参照がどこにあるかを把握する方法に関する適切な記事です。おそらく、「追加の背景」リンクも読みたいと思うでしょう.

于 2012-11-19T09:27:28.983 に答える
0

おそらくこの議論は、C#の.net Finalize/Disposeパターンでのメモリ管理に関して実際に何が起こっているのかを理解するのに役立ちます

念のため、これはオブジェクトを破棄する方法に関する別の投稿です。破棄/ファイナライズパターンを使用してソケット/イベント/アンマグされたコードを解放するための正しいテクニックです。

于 2012-11-19T09:12:38.037 に答える
0

おそらく、オブジェクトはIDisposableを実装して、不要になったときにリソースをクリーンアップできるようにする必要があります。このMSDNの記事は、それを実装する方法を示しています。

IDisposableを掘り下げる

于 2012-11-19T09:13:39.890 に答える