3

私が仕事のために書いているプログラムは、それ自体が使用するメモリを追跡する必要があります。しかし、全体としてのメモリ使用量を監視することはできません。プログラム内の各オブジェクトと、そのオブジェクトが使用しているメモリ量を監視する必要があります。そのようにして、上記を使用している場合、メモリ使用量を削減するようにオブジェクトに指示できます。ある程度の容量。メモリ使用量を監視する部分は、作成されたすべてのオブジェクトへのポインタを保持し、オブジェクトのサイズを返すそのオブジェクトのメソッドを呼び出すことによって、それらのメモリ使用量を追跡します。

私が抱えている問題は、使用されているメモリのサイズを正確に計算できないことです。私の計算が少しずれていても問題ありませんが、大きな違いが得られています。私のプログラムが計算するサイズは、(プログラムが実行するアクションに応じて) プログラムの実際のメモリ使用量の 1/2 から 2/3 の間で異なります。たとえば、3.35 GB の RAM を使用するプログラムは、2.16 GB しか使用しないと計算されました。

オブジェクトのサイズを計算する現在の方法は、オブジェクト内のベクトルまたは配列の長さに sizeof(*this) を追加し、ベクトル/配列内の要素のサイズを掛けたものです。

使用メモリの計算方法に何か問題がありますか? それとも、私が考慮していない何か他のものがありますか? プログラムのさまざまな側面でメモリ使用量を分析できるプログラムを誰かが知っている場合、それは非常に役立ちます。そうすれば、この余分なメモリがどこから来ているのかを追跡できます(できれば、GUIなしでLinuxで実行できるもの私はUbuntuサーバーを使用していますが、使用できるWindowsマシンもあります)。

4

1 に答える 1

2

使用メモリの計算方法に何か問題がありますか?

はい。まず第一に、プログラムによって消費されるメモリのサイズは、ある時点で完全には使用されない可能性があります。たとえば、ベクトルのサイズが変更された後、古いメモリ ブロックがシステムに返される場合があります。または、次に誰かが同じサイズのメモリ ブロックを要求したときのために、ヒープによって保持される場合もあります。

また、使用しているライブラリ (OS API など) はすべてメモリを割り当てますが、それらは無料ではないことに注意してください。

また、メモリ割り当てごとにヒープ マネージャーによって追加のオーバーヘッドが課されることにも注意してください。通常、割り当てごとに 1 つまたは 2 つのポインターのオーダーです。

アプリケーションで何がメモリを使用しているかを追跡したい場合は、実メモリ プロファイラを使用してください。プログラムが最初に割り当てるメモリの量を動的にスケーリングする場合は、プロファイラーを使用して、処理しているオブジェクトの 1 つが占める平均サイズを計算し、メモリ サイズではなくオブジェクトの数で制限します。

于 2012-12-12T04:03:42.843 に答える