我在项目中添加了libxml2的自定义分配器,我看到了一个alloc和free调用列表。我想要检查的是libxml2如何处理碎片,如果有的话。程序可执行文件开始增加内存并且不会将其返回到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);
答案 0 :(得分:1)
libxml2为您提供了覆盖其内存管理功能的方法 - 如果不是这样,可以采取哪些措施来解决您的问题?这取决于你的功能方面 - 如果你正在使用sbrk(或使用sbrk的malloc) - 你永远不会返回内存。您可以尝试为每个分配使用单独的mmap,但是如果存在大量非常小的分配,则会显着增加内存占用。更好的方法是使用mmap分配缓冲区,并将它们用作未来分配的内存缓冲区。