2017-11-20 25 views
3

Windowsでバックグラウンドプロセスとして実行されるCを使用するWebSocket Serverがあります。そして、このプロセスは大きな画像データ(base64形式)を含む要求を受け入れます。フリーコール時にメモリ使用量が減少しない

リクエストが受信されるたびに、メモリはmallocを使用して割り当てられます。そして要求が実行された後にfree'd。

しかし、タスクマネージャをチェックすると、メモリ使用量は減少しません。また、別のリクエストを送信すると、追加のメモリが割り当てられます。

私の質問は、プロセスが割り当てられたメモリを解放しなかったか、または以前に割り当てられたメモリを再利用しなかったことです。

+0

どのようなWindows OSバージョンですか? –

+0

私はWindows 7 Ultimateを使用しています – Ronnie

答えて

4

freeの基本的な実装はプラットフォームによって異なりますが、実際に目にしているのは遅延のあるのメモリ割り当て/割り当て解除によるものです。お使いのOS(またはメモリ管理ルーチン)は、解放したばかりのメモリを認識していますが、プログラムがさらに多くのメモリを要求する可能性があるため、他のプロセスが要求するまで、それ。したがって、タスクマネージャは、無料の呼び出しにもかかわらず、プログラムのメモリ使用量が減少しないことを示します。

プログラムが解放してより多くのメモリを要求する場合、基本となるメモリ管理ルーチンは、解放したメモリと同じメモリを返す必要はありません。空きブロックを組み合わせることは、coalescingと呼ばれ、高価な操作であるため、最後の瞬間まで遅延され、可能な場合はまったく実行されません。

これを証明するには、別のプログラムをスピンアップして大量のメモリを要求することができます。元のプログラムが適切にメモリを解放した場合、新しいプログラムがメモリを要求するとメモリ使用量が低下します。

+1

メモリを保持するかどうかは、オペレーティングシステムではなくタスク内のメモリ管理ルーチン内で発生する可能性があります。 –

+0

別のリクエスト(mallocを使って)を処理しようとしたところ、free'dメモリを使用するのではなく、なぜメモリ使用量が再び増加しましたか? – Ronnie

+1

@ロニー:おそらく解放された記憶が十分ではなかったので - これが最も一般的な理由です。つまり、あなたは1 M​​iBを解放しましたが、次の要求は1.2 MiBでした。利用可能なブロックがまだないため、新しいブロックが割り当てられました。すすぎ、繰り返します。 –

関連する問題