2012-01-25 8 views
4

自分の壁紙チェンジャープログラムを作成するのは楽しいです。私はインターネット上にたくさんあることを知っていますが、私は単に新しいものを学ぼうとしています。今のところ、単純なプログラムを作成するたびに、私はRAM/Memoryを気にしませんでした。私はほとんどの場合、学校向けのプログラムを作成していました。それは一度使うプログラムのようでした。変数で撮影したメモリを解放する

しかし、今私は、私が使用したいアプリケーションを作成しようとしています。私のプログラムは "alt + ctrl + del"ウィンドウで〜4000kくらいの時間がかかることに気付きました。壁紙を変更すると最大200,000kになることがあります。時にはダウンしてしまいます。 Memorytaken

だからここに質問、実行中に私のアプリの利用可能な最小ラムを作るためのヒントものです(トレイアイコン、メインウィンドウがif (FormWindowState.Minimized == WindowState) Hide();を使用して隠されている)来る

は、任意のメモリを取る関数内の変数ですか?例

int function(int a){ 
int b = 0; 
int c = a+b; 
return c; 
} 

または、これらの変数は関数が何らかの値を返した後に解放されますか?

私はいくつかのヒント、ガイド、および/または記事へのリンクを使用して、その情報を得ることができました。初心者フレンドリーなtho。

編集: さて、私はいくつかを読んで、ビットマップを処理し始めました。私が使っていたグローバル変数の一つを取り除きました。壁紙を変更するときは少し上げますが、それを元に戻します。だから私はそれが私にとって成功の一種だと思う。もう一つ残ったこと。私は大/大/いくつかのオプションプログラムをダウンロードして、壁紙を変更し、それは私よりも多くの選択肢を持っています、そしてそれでも約1000-2000kを取るので、今は私のように "多くの" RAMを取ることができます。私のプログラムを約4100回実行すると、すぐに、私はそれを最適化するために何かをやることができると思います。皆さん、ありがとうございました。 :)

+2

スタック上のローカル変数のメモリ領域は、メソッドが返ってきたときにスタックがアンワインドされるときに再利用され、その時点のヒープ上のローカル変数の参照はガベージコレクションの対象となります。私はGoogleの "C#ガベージコレクションマネージド"を出発点として使用します。 – BrokenGlass

+0

参考までに、タイトルに「Visual Studio C#」などのプレフィックスを付けないでください。それがタグのためのものです。 –

+0

up:Roger that。申し訳ありません、もう一度やりません。 BrokenGlass:ありがとう、確かにそれについていくつかを読むだろう – Kedor

答えて

4

プログラムの観点から見たメモリは、必要に応じて2つのブロックに分かれています。スタックとヒープ。

スタックは現在の実行フレーム(現在実行中の関数など)を表し、関数パラメータ、戻り値を渡すために使用され、ローカル変数は一般に格納されます。現在の実行フレームが終了すると(たとえば、関数が終了したとき)、そのメモリはパージされます。

ヒープは、オブジェクトを作成して長期間保存できるメモリプールを表します。一般に、「new」演算子を使用して作成されたものは、スタック上に存在する参照を持つヒープ上に移動します(ローカルコンテキストの場合)。割り当てられたオブジェクトへの参照が使用されなくなると、未指定の時間にガベージコレクタが実行され、メモリが解放されるまでメモリは取得されたままになります。 GCの実行が保証されない場合、プログラムがメモリ不足またはスケジュールされた間隔で実行されている可能性があります。

私はメモリの動作を観察していると思いますが、スパイクはリソースを開いて読み込むトラフは、GCが実行された後です。これを観察する別の方法は、画面にUIが表示されているときと、プログラムが最小化されているときに、プログラムのメモリフットプリントを調べることです。最小化すると、すべてのグラフィック要素が不要になるため、メモリのフットプリントが縮小します。 UIを最大化して再描画すると、メモリ使用量がピークに達します。

あなたは、スタックとヒープをより良く理解するために、以下の記事を見ることができます:

C# Stack and Heap

What are stack and heap?

ます。また、ガベージコレクションの中に見たいと思うかもしれません:

Garbage collection article on MSDN

...およびValue vs Reference types

1

ローカルで宣言された変数のメモリは自動的に解放されます。

関数の外で存続する変数のメモリは、もはや使用されなくなっても、GarbageCollector(略してGC)と呼ばれるものによって解放されます。

あなたのサンプル関数でメモリリークが発生することはありません。

200,000リットルが使い尽くされた場所を教えてもらえません。プロファイラーがあります(私は何もお勧めできませんが、これはGoogleで初めてです:http://memprofiler.com/

+0

実際、サンプル関数はおそらくジッタによって最適化されています。 – phoog

3

iDisposableインターフェイスを実装するものの周りにブロックを使用することを確認してください。特に、ファイル、ストリーム、または任意の要求を読み込んでいる場合。 http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspxでもう少し詳しく読むことができ、それを使用する方法のいくつかの例が示されています。

関連する問題