2012-12-12 4 views
0

J'ai ajouté mes allocateurs personnalisés pour libxml2 dans un projet et je vois une liste d'alloc et d'appels gratuits. Ce que j'essaie de vérifier, c'est comment libxml2 gère la fragmentation, si c'est le cas. Le programme exécutable commence à augmenter la mémoire et ne le renvoie pas au système d'exploitation. Il existe une documentation libxml2 indiquant que cela peut arriver au cas où le système d'exploitation décide que la mémoire renvoyée est trop petite et trop lourde pour la réutiliser. Mon programme utilise beaucoup de petites allocations en les utilisant et en les libérant. Le reste de l'application utilise des pools de mémoire basés sur le thread afin qu'il n'y ait aucune chance de fuite, ces pools sont réinitialisés à chaque itération des appels du gestionnaire. J'ai utilisé les fonctions suivantes pour écraser les allocateurs par défaut juste pour vérifier les allocations. Toute aide à comprendre ceci pourrait être utile. J'ai essayé de chercher sur le site Web la fragmentation de la mémoire sans succès.comment libxml2 gère la fragmentation

/* 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); 

Répondre

1

libxml2 vous fournit la méthode pour la remplacer pour les fonctions de gestion de mémoire - ce qui, sinon cela pourrait être fait pour résoudre votre problème? Cela dépend de vos fonctions - et si vous utilisez sbrk (ou malloc qui utilise sbrk) - vous ne retournez jamais de mémoire. Vous pouvez essayer d'utiliser mmap séparé pour chaque allocation, mais dans le cas d'une grande quantité de très petites allocations, cela augmenterait considérablement l'empreinte de la mémoire. Une meilleure approche consiste à allouer des tampons avec mmap et à les utiliser comme tampons de mémoire pour les allocations futures.

+0

ma question était que libxml2 fournissait n'importe quel type de solution de construction pour minimiser la fragmentation. Je peux utiliser le mécanisme de substitution pour ajouter jemalloc ou un autre allocateur pour le minimiser. libxml2 étant utilisé dans un si grand nombre de projets pourrait avoir une solution interne pour cela. Il garde une trace des allocations et des choses. –

+0

Pourquoi le devrait-il? Il demande de la mémoire, vos fonctions le lui donnant. Ensuite, il demande de libérer ces souvenirs. Si les fonctions de _your_catlee ne le libèrent pas, quelle est la question à libxml? Le meilleur moyen de le faire est d'allouer un gros bloc et de l'utiliser ensuite pour d'autres allocations. Cependant, libxml n'a aucune idée de la quantité de mémoire nécessaire, et il vous a déjà présenté une interface pour le faire vous-même. Je suis sûr que les développeurs de bibliothèques ne devraient pas apporter de changements pour votre cas très spécifique, mais plutôt vous fournir une interface pour le gérer. – keltar

+0

ils ont un ensemble de fonctions par défaut que je demandais à propos de ceux s'ils ont une fonctionnalité de ce genre. Ils ont quelques fonctionnalités pour détecter les fuites de mémoire et les écrasements. De toute façon merci beaucoup j'apprécie mais cela ne répond pas à ma question :(. –