2012-03-29 18 views
0

私はANTSメモリプロファイラを使用していますが、現時点ではやや不満です。メモリリークがあるかどうかを確認するにはどうすればよいですか?

  1. 109メガバイト
  2. 120メガバイト
  3. :私はプロセスに私のサイトのアップとフックANTSをロードした場合、私はその後、以下の結果と時間の同じルーチン数を実行し、90メガバイトの周りにプライベートバイトを見ることができます
  4. 125メガバイト
  5. 126メガバイト
  6. 123メガバイト
  7. 126メガバイト

、それは基本的各試行後に約126MBのままです。私が理解していることは、メモリリークがあった場合、keepが立ち上がって解決しないが、私が理解していないのは、なぜ126mbまでゆっくりと成長するのかということです。 .NETには予約可能なメモリがありますか?それはその制限を打つだけですか?

簡単な質問:メモリはポイントまで成長して停止しています。これは.NETアプリにとっては普通のことですか?

編集:ただ、私はおそらくprogrammers.stackexchange.comでこれを掲載している必要があることに気づいた - 謝罪を。あなたが割り当てられるべきではないと思いますメモリが割り当てられるとき

+0

詳細情報が必要です。コードを掲示し、特定の質問をしてください。 –

+1

メモリプロファイリングツールを使用してください! –

+0

アプリケーション全体のコードを投稿することはできません。質問は簡単です。メモリが特定のポイントまで加算されて停止しています。これは.NETかどうかですか。 – webnoob

答えて

4

「メモリリーク」です。

単に消費するメモリの量を見て、「あなたがメモリリークを持っている」と言うことはできません。私。アプリケーションが3日間メモリ内のログを収集する場合、メモリ消費量は増加しますが、リークの兆候ではありません。一方、あなたのアプリケーションが単純に1分に1行だけを出力しても、メモリ使用量が絶えず増えれば、それはリークです。

+0

良い点。アプリケーションは意図的にメモリ内に何も保持しません。その基本的に開いているデータセットとSQLクエリを実行します。私はそれがどのようにして成長を止めることができるのか理解していません。 – webnoob

+0

@webnoob wellデータセットは、キャッシュを行うことができるメモリ内のコレクションです。一旦ロードされると、データベースにアクセスすることなくメモリ内のデータを処理します(これは私の推測です)。 – oleksii

0

私の経験では、メモリが成長し、高原になると、は一般にキャッシュです。前に述べたように、メモリリークは、リリースされていたはずのメモリ内に何かが残っているときだけです。プロファイラを使用すると、2世代目のガベージコレクションが確実に行われ、メモリに残っているすべてのものを見ることができるため、リークを判断するのに最適です(タスクマネージャを使用する場合と比較して)。

私がプロファイルを作成するとき、私は一般的にすべてのキャッシングが確実に行われることを確認するために数回試したいコマンドを実行してから、前と後のスナップショットを作成してメモリのデルタを比較します。 C#のような管理言語を使用している場合、+/- 10KBのデルタを持つことは珍しいことではありません。そのプロセスを何度か繰り返し、デルタが一貫して肯定的であれば、意図的に多くのメモリを割り当てていないと仮定すると、リークが発生する可能性が高くなります。

関連する問題