2011-12-29 12 views
2

私はWindowsサービスを書くのが初めてです。私はTwilioを通じた発信コールを作成することにしました。私はIDisposableを実装するリソースを使用するときにusingステートメントを利用しています。私はこれまでの4時間の合計のためのサービスを実行し、ここに私のメモリ使用量を見ている:メモリリークが心配すべきでしょうか?

スタート:9K

15分:10K

30分:13K

1 HR:13K

2時間:13K

3時間:13K

30分後には一貫しているようです(13,100から13,200間)が、最初の30分後にまだリソースが割り当てられている理由がわかりません。 OnStart()メソッドは、4つのタイマーといくつかの小さなオブジェクトを開始します。私のオブジェクトの構築には30分かかりません。タイマーは特定の時間だけ待ってからクエリを実行し、結果をTwilioにキューイングして次のイベントを待つだけです。

この時点でメモリリークが心配すべきでしょうか?このようなアプリケーションではこれは正常ですか?

+1

あなたのメモリ使用量が少ないため、ガベージコレクタがおそらく蹴られていない可能性があるので、これはかなり不可能です。サービスを数日間実行してみてください。 – zmbq

+0

それは私が考えていたものですが、確かめるのは難しいです。ご協力いただきありがとうございます!テストサーバーにインストールされ、週末に実行されます。私は月曜日に更新を提供します。 – Kevin

+0

私は@ zmbqに同意します。数日間それを見て、何が起こるかを見てください。メモリ使用量は、コードが何をしているか、ガベージコレクタによって変動しますが、平均値の範囲内に収まる必要があります。 – user1231231412

答えて

1

いいえ、メモリリークが心配する必要はありません。

数ギガバイトのメモリが利用できるマシンでは、13kバイトのメモリが消費されます。これが着実に成長し、決して減少しなければ、あなたはリークがあります:そうでなければ、あなたは大丈夫です。


それはCLR内の文字列は、あなたが「チェンジ」の文字列の新しいコピーが作成され、古いバージョンに割り当てられたメモリが使用されていないとしてマークされているので、すべての時間不変であることを覚えておく価値があります。だから、ほとんどのプログラムは通常の日常的な使い方でちょっとしたメモリを使いこなしています。これは正常であり、エッジ条件では非常にタイトなループや巨大なコレクション、あるいはその両方などが懸念されます。

でも、.NETガベージコレクタ(GC)は、この古いメモリを掃除して時折集約する素晴らしい仕事をしています。

文字列(およびその他のオブジェクト)に、使用後に解放されないメモリ(およびファイルハンドルなどの他のリソース)を割り当てることができる状況があります。それはDispose()を使用する必要があります。

+0

詳細な説明をありがとう。文字列についてのあなたの言い分が意味をなさない、私はちょうどそれがもう少し一定であることを期待していました。ありがとう! – Kevin

1

HTTP要求などを実行するときに、フレームワークが依然としていくつかの機能を割り当てている可能性があります。

私はこの時点で心配する必要はありませんが、本当にしたいのであれば、CLR Profilerまたは別の.NETメモリプロファイラを使用して、何が起こっているのか、それが気になるものかを確認できます。

+0

ありがとう!私はCLRプロファイラを見て、私のHTTPリクエストをコメントアウトしようとします。私は月曜日の結果であなたにお返しします。 – Kevin

関連する問題