2012-12-12 2 views
0

Я добавил свои пользовательские распределители для libxml2 в проект, и я вижу список выделенных и бесплатных вызовов. Я пытаюсь проверить, как libxml2 имеет дело с фрагментацией, если вообще это делает. Исполняемый файл программы начинает увеличивать память и не возвращает ее обратно в ОС. Существует документация 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); 

ответ

1

libxml2 предоставляет метод, чтобы переопределить это функции управления памятью - то, что, если бы не это, можно было бы сделать, чтобы решить проблему? Это зависит от ваших функций - и если вы используете sbrk (или malloc, который использует sbrk), вы никогда не возвращаете память. Вы можете попробовать использовать отдельный mmap для каждого отдельного размещения, однако в случае большого количества очень маленьких распределений это значительно увеличит объем памяти. Лучший подход - выделить буферы с помощью mmap и использовать их в качестве папок памяти для будущих распределений.

+0

мой вопрос был ли libxml2 предоставить любое решение для сборки для минимизации фрагментации. Я могу использовать механизм переопределения для плагина в jemalloc или какой-либо другой распределитель, хотя для его минимизации. libxml2, используемый во многих проектах, может иметь для этого некоторое внутреннее решение. Он отслеживает распределение и прочее. –

+0

Зачем? Он запрашивает память, ваши функции дают ее. Затем он просит освободить эту память. Если функции _your_ callee на самом деле не освобождают его - что вопрос для libxml? Лучший способ сделать это - выделить большой блок, а затем использовать его для дальнейших распределений - однако libxml definitevely не имеет никаких идей о том, сколько памяти ему потребуется, и он уже представил вам интерфейс, чтобы сделать это самостоятельно. Я уверен, что разработчики библиотек не должны вносить изменения в свой конкретный случай, а скорее предоставить вам интерфейс для его обработки. – keltar

+0

у них есть набор функций по умолчанию, о которых я спрашивал, если у них есть некоторые функции такого рода. У них есть некоторые функции для обнаружения утечек памяти и перезаписывания. В любом случае спасибо большое, я это ценю, но это не отвечает на мой вопрос :(. –

Смежные вопросы