0

我在一个项目中为 libxml2 添加了我的自定义分配器,我看到了一个 alloc 和 free 调用的列表。我要检查的是 libxml2 如何处理碎片,如果有的话。程序可执行文件开始增加内存并且不会将其返回给操作系统。有一个 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 回答