3

私のプログラムは大量のメモリを使用します。これは valgrind massif ツールが私に示しているものです:

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
 28 38,531,086,036      760,235,208      143,002,822   617,232,386            0

ご覧のとおり、余分な部分は有用なヒープの数倍の大きさです。

この余分なメモリを減らすにはどうすればよいですか? 少ない割り当てを行いますか?

これはいわゆるメモリの断片化ですか?

OS: Linux 2.6。プログラムは C で書かれています。24 時間年中無休で動作し、大量のデータを操作します。

4

3 に答える 3

3

ドキュメントによると、「エクストラヒープ」バイトは次のとおりです。

その時点で割り当てられた追加のヒープバイト数。これは、プログラムが要求した量を超えて割り当てられたバイト数を反映しています。余分なヒープバイトのソースは2つあります。

まず、すべてのヒープブロックには管理バイトが関連付けられています。管理バイトの正確な数は、アロケータの詳細によって異なります。例からわかるように、デフォルトではMassifはブロックあたり8バイトを想定していますが、この数は--heap-adminオプションを使用して変更できます。

次に、アロケータは、要求されたバイト数をより大きな数(通常は8または16)に切り上げることがよくあります。これは、ブロック内の要素が適切に整列されるようにするために必要です。Nバイトが要求された場合、MassifはNを--alignmentオプションで指定された値の最も近い倍数に切り上げます。

これは私にはメモリの断片化のようには聞こえません。

メモリの断片化は通常、多くの小さな割り当てによって引き起こされます。割り当てられたメモリの各ユニット間に小さなギャップができてしまい、より大きな割り当てのためにメモリの連続した領域を取得することが難しくなります。

メモリの割り当てを防ぐには、基本的に割り当てを減らします。可能な限りスタックスペースを使用し(たとえば、不必要にnewを使用しないでください)、可能であれば、メモリを割り当て続けないように、頻繁に割り当てられるオブジェクトをプールすることを検討してください。

于 2011-03-21T13:20:10.900 に答える
3

非常に小さなオブジェクトをたくさん割り当てていますか? たとえば、ほんの数バイトですか? すべての割り当てに関連する一定量のオーバーヘッドがあります (たとえば、freeブロックの大きさを知る必要があるため)。

これは、「内部断片化」と呼ばれることもあります。これは、未割り当てのメモリが一定量存在するが、使用するには小さすぎるブロックに分割されているために使用できない「外部断片化」とは対照的です。malloc(が非常に小さなブロックを返さないもう 1 つの理由は、これが外部の断片化を減らすのに役立つためです。)

非常に小さなオブジェクトを多数割り当てる場合、ヒープに個別に割り当てるのではなく、個別に管理することを検討する必要があります。これを正しく行えば、他の方法でも改善される可能性があります (たとえば、メモリの局所性の改善など)。

于 2011-03-21T13:24:10.803 に答える
0

サイズの大きい割り当てを少なくするか、ヒープを微調整することができます。後者は実装固有です。

これは断片化ではありません。たとえば7バイトを要求すると、ヒープは7バイト以上を割り当てます。つまり16バイトになる可能性があるため、9バイトは「余分」になり、実際には無駄になります。これはさまざまな理由で行われます。たとえば、位置合わせを維持するためです。

于 2011-03-21T13:19:49.393 に答える