2016-08-02 16 views
-1

私は過去数週間、C#アプリケーションを実行していました。私が最初に起動したとき、メモリ使用量は〜10000Kでした。それ以来、私はチェックしたところ、それは〜20000Kのメモリフットプリントにあります。今ガベージコレクションが実行されていますか?

よくわかりません。ネットガベージコレクションは非常にうまくいますが、これは間違いなくメモリリークがあるという印ですか? GCは今までに実行してはいけませんか?

私はここにガベージコレクションに読んだ:

https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx

そして、彼らはGCが実行する必要があるときのために、以下の条件があります。

  • システムが低い物理メモリを持っています。

  • 管理ヒープ に割り当てられたオブジェクトによって使用されるメモリは、許容可能な閾値を超える(Iメモリの70000Kを使用する左ので、これがトリガされるべきではないウェル上に有しています)。プロセスが実行されると、このしきい値は連続的に に調整されます。 (どのようにあなたが「許容」のしきい値を定義していますか?)

私はGCが数週間のタイムスパンで実行していることを期待するべきではないでしょうか。

+1

.NETがゴミを収集していないと思う最も一般的な理由は、タスクマネージャがそれらを表示していることと.NETがヒープを管理する方法を誤解していることです。ちょうどあなたのプログラムの直接メモリ消費量が減ったからといって、それは.NETがメモリをWindowsに戻したわけではありません。または、おそらくあなたはメモリリークを持っています。知るか?あなたは良い[mcve]を提供していません。 –

+0

メモリリークの有無を確認するには、タスクマネージャを使用しないでください。代わりに、適切なメモリプロファイラを使用してください。 Visual Stuidioには1つが付属しています。 – jetstream96

+0

ガベージコレクタを実行せずに10MBから20MBに移行することは、サーバクラスのマシンでのみ可能です。典型的なC#プログラムでは、マシン上の使用可能なRAMを効果的に使用することで、コードを高速で実行できるようになり、CLRはその利点を最大限に活用します。あなたのプログラムがそれほどチャンスを与えないように見えます。あなたは〜1.5ギガバイトに向かって絶えず登ることができるときにだけ漏れがあります。あなたはあなたの耳の間の閾値を調整する必要があります:) –

答えて

0

GCを数週間のタイムスパンで実行する必要はありませんか?

いいえ、GC.Collectが適時に発生するとは限りません。

  • システムの低い物理メモリがあります。次のいずれかの条件に 真であるとき

    ガベージコレクションが発生します。

  • 管理されたヒープ上の割り当てられたオブジェクトによって使用されるメモリは、許容可能なしきい値を超えています。このしきい値は、プロセスの実行時に調整された連続的に
    です。
  • GC.Collectメソッドが呼び出されます。ほとんどの場合、ガベージコレクタは を連続して実行するため、このメソッドを呼び出す必要はありません。このメソッドは、主に固有の状況 とテストに使用されます。

詳細はfundamentalを参照してください。

関連する問題