1

malloc、calloc、realloc、および free 関数を使用して、メモリを継続的に割り当てて解放する C Linux アプリケーション (毎秒約 200 の割り当て/解放) があります。割り当てられたすべてのメモリが解放されても (*alloc と free をラップすることで確認)、VmSize、VmRSS、および VmData の数値は増加し続け、最終的にアプリケーションは OOM キラーによって強制終了されます。

VmSize、VmRSS、および VmData が増加し続けるのはなぜですか? それがメモリ管理の問題である場合、これを回避するためのポインタはありますか?

この問題の使用メモリは Cで見ましたが、答えは OOM の動作を説明していません。

4

1 に答える 1

0

最初にvalgrindを使用する必要があります(潜在的に見つけにくいメモリ リークや誤動作をデバッグするため)。でコンパイルすることを忘れないでくださいgcc -Wall -g(そして、それが機能するときに使用します-Wall -O); もちろん、警告が表示されなくなるまでコードを改善してください。

おそらく(アルゴリズムが適合する場合)、たとえば2のべき乗、または2のべき乗の3倍[おそらくマイナス2または3ワード]のメモリゾーンを(便利に)割り当てようとすることができます。少なくとも、あまりにも多くの異なるランダム サイズの割り当てを避けるようにしてください。

Boehm の保守的なガベージコレクターを使用してみmallocてください。GC_MALLOCGC_MALLOC_ATOMICstrdupGC_STRDUPfreeGC_FREE

少なくともテスト目的で、おそらく bash ulimitビルトインを介してsetrlimit(2)を使用します。あなたが望む-おそらく(これらの制限を設定すると、OOMキラーが賢明に回避され、メモリが使い果たされたときに-called by-が失敗します)。RLIMIT_ASRLIMIT_DATAmmapmalloc

-fsanitize=addressを受け入れる GCC 4.8 でコンパイルすることをお勧めします。

独自のアプリケーション固有のガベージ コレクターを実装することもできます(そのウィキページを読んでください。洞察と用語が得られます)。マーク & コンパクト アルゴリズムは断片化に対抗します。

this question about memory fragmentationも参照してください。プラグツールを調べます。

于 2013-05-16T11:36:41.357 に答える