IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an
email to Administrator. User accounts are meant only to access repo
and report issues and/or generate pull requests.
This is a purpose-specific Git hosting for
BaseALT
projects. Thank you for your understanding!
Только зарегистрированные пользователи имеют доступ к сервису!
Для получения аккаунта, обратитесь к администратору.
</style><title>Memory Management</title></head><bodybgcolor="#8b7765"text="#000000"link="#a06060"vlink="#000000"><tableborder="0"width="100%"cellpadding="5"cellspacing="0"align="center"><tr><tdwidth="120"><ahref="http://swpat.ffii.org/"><imgsrc="epatents.png"alt="Action against software patents"/></a></td><tdwidth="180"><ahref="http://www.gnome.org/"><imgsrc="gnome2.png"alt="Gnome2 Logo"/></a><ahref="http://www.w3.org/Status"><imgsrc="w3c.png"alt="W3C Logo"/></a><ahref="http://www.redhat.com/"><imgsrc="redhat.gif"alt="Red Hat Logo"/></a><divalign="left"><ahref="http://xmlsoft.org/"><imgsrc="Libxml2-Logo-180x168.gif"alt="Made with Libxml2 Logo"/></a></div></td><td><tableborder="0"width="90%"cellpadding="2"cellspacing="0"align="center"bgcolor="#000000"><tr><td><tablewidth="100%"border="0"cellspacing="1"cellpadding="3"bgcolor="#fffacd"><tr><tdalign="center"><h1>The XML C parser and toolkit of Gnome</h1><h2>Memory Management</h2></td></tr></table></td></tr></table></td></tr></table><tableborder="0"cellpadding="4"cellspacing="0"width="100%"align="center"><tr><tdbgcolor="#8b7765"><tableborder="0"cellspacing="0"cellpadding="2"width="100%"><tr><tdvalign="top"width="200"bgcolor="#8b7765"><tableborder="0"cellspacing="0"cellpadding="1"width="100%"bgcolor="#000000"><tr><td><tablewidth="100%"border="0"cellspacing="1"cellpadding="3"><tr><tdcolspan="1"bgcolor="#eecfa1"align="center"><center><b>Developer Menu</b></center></td></tr><tr><tdbgcolor="#fffacd"><formaction="search.php"enctype="application/x-www-form-urlencoded"method="get"><inputname="query"type="text"size="20"value=""/><inputname="submit"type="submit"value="Search ..."/></form><ul><li><ahref="index.html"style="font-weight:bold">Main Menu</a></li><li><ahref="html/index.html"style="font-weight:bold">Reference Manual</a></li><li><ahref="examples/index.html"style="font-weight:bold">Code Examples</a></li><li><ahref="guidelines.html">XML Guidelines</a></li><li><ahref="tutorial/index.html">Tutorial</a></li><li><ahref="xmlreader.html">The Reader Interface</a></li><li><ahref="ChangeLog.html">ChangeLog</a></li><li><ahref="XSLT.html">XSLT</a></li><li><ahref="python.html">Python and bindings</a></li><li><ahref="architecture.html">libxml2 architecture</a></li><li><ahref="tree.html">The tree output</a></li><li><ahref="interface.html">The SAX interface</a></li><li><ahref="xmlmem.html">Memory Management</a></li><li><ahref="xmlio.html">I/O Interfaces</a></li><li><ahref="library.html">The parser interfaces</a></li><li><ahref="entities.html">Entities or no entities</a></li><li><ahref="namespaces.html">Namespaces</a></li><li><ahref="upgrade.html">Upgrading 1.x code</a></li><li><ahref="threads.html">Thread safety</a></li><li><ahref="DOM.html">DOM Principles</a></li><li><ahref="example.html">A real example</a></li><li><ahref="xml.html">flat page</a>, <ahref="site.xsl">stylesheet</a></li></ul></td></tr></table><tablewidth="100%"border="0"cellspacing="1"cellpadding="3"><tr><tdcolspan="1"bgcolor="#eecfa1"align="center"><center><b>API Indexes</b></center></td></tr><tr><tdbgcolor="#fffacd"><ul><li><ahref="APIchunk0.html">Alphabetic</a></li><li><ahref="APIconstructors.html">Constructors</a></li><li><ahref="APIfunctions.html">Functions/Types</a></li><li><ahref="APIfiles.html">Modules</a></li><li><ahref="APIsymbols.html">Symbols</a></li></ul></td></tr></table><tablewidth="100%"border="0"cellspacing="1"cellpadding="3"><tr><tdcolspan="1"bgcolor="#eecfa1"align="center"><center><b>Related links</b></center></td></tr><tr><tdbgcolor="#fffacd"><ul><li><ahref="http://mail.gnome.org/archives/xml/">Mail archive</a></li><li><ahref="http://xmlsoft.org/XSLT/">XSLT libxslt</a></li><li><ahref="http://phd.cs.unibo.it/gdome2/">DOM gdome2</a></li><li><ahref="http://www.aleksey.com/xmlsec/">XML-DSig xmlsec</a></li><li><ahref="ftp://xmlsoft.org/">FTP</a></li><li><ahref="http://www.zlatkovic.com/projects/libxml/">Windows binaries</a></li><li><ahref="http://opencsw.org/packages/libxml2">Sola
</ul><h3><aname="setting"id="setting">Setting libxml2 set of memory routines</a></h3><p>It is sometimes useful to not use the default memory allocator, either for
debugging, analysis or to implement a specific behaviour on memory management
compatibles).</p><h3><aname="cleanup"id="cleanup">Cleaning up after using the library</a></h3><p>Libxml2 is not stateless, there is a few set of memory structures needing
</ul><p>Generally xmlCleanupParser() is safe assuming no parsing is ongoing and
no document is still being used, if needed the state will be rebuild at the
next invocation of parser routines (or by xmlInitParser()), but be careful
of the consequences in multithreaded applications.</p><h3><aname="Debugging"id="Debugging">Debugging routines</a></h3><p>When configured using --with-mem-debug flag (off by default), libxml2 uses
<li>run the program under a debugger and set a breakpoint on
xmlMallocBreakpoint() a specific function called when this precise block
is allocated</li>
<li>when the breakpoint is reached you can then do a fine analysis of the
allocation an step to see the condition resulting in the missing
deallocation.</li>
</ol><p>I used to use a commercial tool to debug libxml2 memory problems but after
noticing that it was not detecting memory leaks that simple mechanism was
used and proved extremely efficient until now. Lately I have also used <ahref="http://developer.kde.org/~sewardj/">valgrind</a> with quite some
success, it is tied to the i386 architecture since it works by emulating the
processor and instruction set, it is slow but extremely efficient, i.e. it
spot memory usage errors in a very precise way.</p><h3><aname="General4"id="General4">General memory requirements</a></h3><p>How much libxml2 memory require ? It's hard to tell in average it depends
</ul><p></p><h3><aname="Compacting"id="Compacting">Returning memory to the kernel</a></h3><p>You may encounter that your process using libxml2 does not have a
reduced memory usage although you freed the trees. This is because
libxml2 allocates memory in a number of small chunks. When freeing one
of those chunks, the OS may decide that giving this little memory back
to the kernel will cause too much overhead and delay the operation. As
all chunks are this small, they get actually freed but not returned to
the kernel. On systems using glibc, there is a function call
"malloc_trim" from malloc.h which does this missing operation (note that
it is allowed to fail). Thus, after freeing your tree you may simply try
"malloc_trim(0);" to really get the memory back. If your OS does not
provide malloc_trim, try searching for a similar function.</p><p></p><p><ahref="bugs.html">Daniel Veillard</a></p></td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table></body></html>