私は過去数週間、C#アプリケーションを実行していました。私が最初に起動したとき、メモリ使用量は〜10000Kでした。それ以来、私はチェックしたところ、それは〜20000Kのメモリフットプリントにあります。今ガベージコレクションが実行されていますか?
よくわかりません。ネットガベージコレクションは非常にうまくいますが、これは間違いなくメモリリークがあるという印ですか? GCは今までに実行してはいけませんか?
私はここにガベージコレクションに読んだ:
https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx
そして、彼らはGCが実行する必要があるときのために、以下の条件があります。
システムが低い物理メモリを持っています。 は
管理ヒープ に割り当てられたオブジェクトによって使用されるメモリは、許容可能な閾値を超える(Iメモリの70000Kを使用する左ので、これがトリガされるべきではないウェル上に有しています)。プロセスが実行されると、このしきい値は連続的に に調整されます。 (どのようにあなたが「許容」のしきい値を定義していますか?)
私はGCが数週間のタイムスパンで実行していることを期待するべきではないでしょうか。
.NETがゴミを収集していないと思う最も一般的な理由は、タスクマネージャがそれらを表示していることと.NETがヒープを管理する方法を誤解していることです。ちょうどあなたのプログラムの直接メモリ消費量が減ったからといって、それは.NETがメモリをWindowsに戻したわけではありません。または、おそらくあなたはメモリリークを持っています。知るか?あなたは良い[mcve]を提供していません。 –
メモリリークの有無を確認するには、タスクマネージャを使用しないでください。代わりに、適切なメモリプロファイラを使用してください。 Visual Stuidioには1つが付属しています。 – jetstream96
ガベージコレクタを実行せずに10MBから20MBに移行することは、サーバクラスのマシンでのみ可能です。典型的なC#プログラムでは、マシン上の使用可能なRAMを効果的に使用することで、コードを高速で実行できるようになり、CLRはその利点を最大限に活用します。あなたのプログラムがそれほどチャンスを与えないように見えます。あなたは〜1.5ギガバイトに向かって絶えず登ることができるときにだけ漏れがあります。あなたはあなたの耳の間の閾値を調整する必要があります:) –