0

プロジェクトにlibxml2のカスタムアロケータを追加しましたが、allocとfree呼び出しのリストが表示されます。私がチェックしようとしているのは、libxml2が断片化を処理する場合、どのように処理するかです。プログラム実行可能ファイルはメモリの増加を開始し、OSに戻しません。返されるメモリが小さすぎて、それを再利用するにはオーバーヘッドが大きすぎるとOSが判断した場合に、これが発生する可能性があることを示すlibxml2のドキュメントがあります。私のプログラムは、それらを使用して解放する多くの小さな割り当てを使用します。アプリケーションの残りの部分はスレッドベースのメモリプールを使用するため、そこにリークする可能性はありません。これらのプールは、ハンドラー呼び出しが繰り返されるたびにリセットされます。次の関数を使用して、割り当てを確認するためだけにデフォルトのアロケータを上書きしました。これを理解する助けが役立つかもしれません。

/* the function override the libxml2 default ones **/
void cfreeFunc(void* ptr);
void * cmallocFunc(size_t size);
void * cmallocAtomicFunc(size_t size);
void * creallocFunc(void *ptr, size_t size);
char * cstrdupFunc(const char *str);

xmlGcMemSetup(cfreeFunc, cmallocFunc, cmallocAtomicFunc, creallocFunc,
        cstrdupFunc);
4

1 に答える 1

1

libxml2 は、そのメモリ管理機能をオーバーライドする方法を提供します。これがなければ、問題に対処するために何ができますか? それはあなたの関数側次第です-そして、sbrk(またはsbrkを使用するmalloc)を使用している場合-メモリを返すことはありません。割り当てごとに個別の mmap を使用してみることができますが、非常に小さな割り当てが大量にある場合は、メモリ フットプリントが大幅に増加します。より良いアプローチは、mmap でバッファーを割り当て、それらを将来の割り当て用のメモリ パッドとして使用することです。

于 2012-12-12T08:41:42.827 に答える