⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlmem.html

📁 libxml,在UNIX/LINUX下非常重要的一个库,为XML相关应用提供方便.目前上载的是最新版本,若要取得最新版本,请参考里面的readme.
💻 HTML
字号:
<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /><link rel="SHORTCUT ICON" href="/favicon.ico" /><style type="text/css">TD {font-family: Verdana,Arial,Helvetica}BODY {font-family: Verdana,Arial,Helvetica; margin-top: 2em; margin-left: 0em; margin-right: 0em}H1 {font-family: Verdana,Arial,Helvetica}H2 {font-family: Verdana,Arial,Helvetica}H3 {font-family: Verdana,Arial,Helvetica}A:link, A:visited, A:active { text-decoration: underline }</style><title>Memory Management</title></head><body bgcolor="#8b7765" text="#000000" link="#a06060" vlink="#000000"><table border="0" width="100%" cellpadding="5" cellspacing="0" align="center"><tr><td width="120"><a href="http://swpat.ffii.org/"><img src="epatents.png" alt="Action against software patents" /></a></td><td width="180"><a href="http://www.gnome.org/"><img src="gnome2.png" alt="Gnome2 Logo" /></a><a href="http://www.w3.org/Status"><img src="w3c.png" alt="W3C Logo" /></a><a href="http://www.redhat.com/"><img src="redhat.gif" alt="Red Hat Logo" /></a><div align="left"><a href="http://xmlsoft.org/"><img src="Libxml2-Logo-180x168.gif" alt="Made with Libxml2 Logo" /></a></div></td><td><table border="0" width="90%" cellpadding="2" cellspacing="0" align="center" bgcolor="#000000"><tr><td><table width="100%" border="0" cellspacing="1" cellpadding="3" bgcolor="#fffacd"><tr><td align="center"><h1>The XML C parser and toolkit of Gnome</h1><h2>Memory Management</h2></td></tr></table></td></tr></table></td></tr></table><table border="0" cellpadding="4" cellspacing="0" width="100%" align="center"><tr><td bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td valign="top" width="200" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Developer Menu</b></center></td></tr><tr><td bgcolor="#fffacd"><form action="search.php" enctype="application/x-www-form-urlencoded" method="get"><input name="query" type="text" size="20" value="" /><input name="submit" type="submit" value="Search ..." /></form><ul><li><a href="index.html" style="font-weight:bold">Main Menu</a></li><li><a href="html/index.html" style="font-weight:bold">Reference Manual</a></li><li><a href="examples/index.html" style="font-weight:bold">Code Examples</a></li><li><a href="guidelines.html">XML Guidelines</a></li><li><a href="tutorial/index.html">Tutorial</a></li><li><a href="xmlreader.html">The Reader Interface</a></li><li><a href="ChangeLog.html">ChangeLog</a></li><li><a href="XSLT.html">XSLT</a></li><li><a href="python.html">Python and bindings</a></li><li><a href="architecture.html">libxml2 architecture</a></li><li><a href="tree.html">The tree output</a></li><li><a href="interface.html">The SAX interface</a></li><li><a href="xmlmem.html">Memory Management</a></li><li><a href="xmlio.html">I/O Interfaces</a></li><li><a href="library.html">The parser interfaces</a></li><li><a href="entities.html">Entities or no entities</a></li><li><a href="namespaces.html">Namespaces</a></li><li><a href="upgrade.html">Upgrading 1.x code</a></li><li><a href="threads.html">Thread safety</a></li><li><a href="DOM.html">DOM Principles</a></li><li><a href="example.html">A real example</a></li><li><a href="xml.html">flat page</a>, <a href="site.xsl">stylesheet</a></li></ul></td></tr></table><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>API Indexes</b></center></td></tr><tr><td bgcolor="#fffacd"><ul><li><a href="APIchunk0.html">Alphabetic</a></li><li><a href="APIconstructors.html">Constructors</a></li><li><a href="APIfunctions.html">Functions/Types</a></li><li><a href="APIfiles.html">Modules</a></li><li><a href="APIsymbols.html">Symbols</a></li></ul></td></tr></table><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Related links</b></center></td></tr><tr><td bgcolor="#fffacd"><ul><li><a href="http://mail.gnome.org/archives/xml/">Mail archive</a></li><li><a href="http://xmlsoft.org/XSLT/">XSLT libxslt</a></li><li><a href="http://phd.cs.unibo.it/gdome2/">DOM gdome2</a></li><li><a href="http://www.aleksey.com/xmlsec/">XML-DSig xmlsec</a></li><li><a href="ftp://xmlsoft.org/">FTP</a></li><li><a href="http://www.zlatkovic.com/projects/libxml/">Windows binaries</a></li><li><a href="http://www.blastwave.org/packages.php/libxml2">Solaris binaries</a></li><li><a href="http://www.zveno.com/open_source/libxml2xslt.html">MacOsX binaries</a></li><li><a href="http://sourceforge.net/projects/libxml2-pas/">Pascal bindings</a></li><li><a href="http://bugzilla.gnome.org/buglist.cgi?product=libxml2">Bug Tracker</a></li></ul></td></tr></table></td></tr></table></td><td valign="top" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%"><tr><td><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table border="0" cellpadding="3" cellspacing="1" width="100%"><tr><td bgcolor="#fffacd"><p>Table of Content:</p><ol><li><a href="#General3">General overview</a></li>  <li><a href="#setting">Setting libxml2 set of memory routines</a></li>  <li><a href="#cleanup">Cleaning up after parsing</a></li>  <li><a href="#Debugging">Debugging routines</a></li>  <li><a href="#General4">General memory requirements</a></li></ol><h3><a name="General3" id="General3">General overview</a></h3><p>The module <code><a href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlmemory.h</a></code>provides the interfaces to the libxml2 memory system:</p><ul><li>libxml2 does not use the libc memory allocator directly but xmlFree(),    xmlMalloc() and xmlRealloc()</li>  <li>those routines can be reallocated to a specific set of routine, by    default the libc ones i.e. free(), malloc() and realloc()</li>  <li>the xmlmemory.c module includes a set of debugging routine</li></ul><h3><a name="setting" id="setting">Setting libxml2 set of memory routines</a></h3><p>It is sometimes useful to not use the default memory allocator, either fordebugging, analysis or to implement a specific behaviour on memory management(like on embedded systems). Two function calls are available to do so:</p><ul><li><a href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlMemGet    ()</a> which return the current set of functions in use by the parser</li>  <li><a href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlMemSetup()</a>    which allow to set up a new set of memory allocation functions</li></ul><p>Of course a call to xmlMemSetup() should probably be done before callingany other libxml2 routines (unless you are sure your allocations routines arecompatibles).</p><h3><a name="cleanup" id="cleanup">Cleaning up after parsing</a></h3><p>Libxml2 is not stateless, there is a few set of memory structures needingallocation before the parser is fully functional (some encoding structuresfor example). This also mean that once parsing is finished there is a tinyamount of memory (a few hundred bytes) which can be recollected if you don'treuse the parser immediately:</p><ul><li><a href="http://xmlsoft.org/html/libxml-parser.html">xmlCleanupParser    ()</a> is a centralized routine to free the parsing states. Note that it    won't deallocate any produced tree if any (use the xmlFreeDoc() and    related routines for this).</li>  <li><a href="http://xmlsoft.org/html/libxml-parser.html">xmlInitParser    ()</a> is the dual routine allowing to preallocate the parsing state    which can be useful for example to avoid initialization reentrancy    problems when using libxml2 in multithreaded applications</li></ul><p>Generally xmlCleanupParser() is safe, if needed the state will be rebuildat the next invocation of parser routines, but be careful of the consequencesin multithreaded applications.</p><h3><a name="Debugging" id="Debugging">Debugging routines</a></h3><p>When configured using --with-mem-debug flag (off by default), libxml2 usesa set of memory allocation debugging routines keeping track of all allocatedblocks and the location in the code where the routine was called. A couple ofother debugging routines allow to dump the memory allocated infos to a fileor call a specific routine when a given block number is allocated:</p><ul><li><a href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlMallocLoc()</a>    <a href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlReallocLoc()</a>    and <a href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlMemStrdupLoc()</a>    are the memory debugging replacement allocation routines</li>  <li><a href="http://xmlsoft.org/html/libxml-xmlmemory.html">xmlMemoryDump    ()</a> dumps all the informations about the allocated memory block lefts    in the <code>.memdump</code> file</li></ul><p>When developing libxml2 memory debug is enabled, the tests programs callxmlMemoryDump () and the "make test" regression tests will check for anymemory leak during the full regression test sequence, this helps a lotensuring that libxml2  does not leak memory and bullet proof memoryallocations use (some libc implementations are known to be far too permissiveresulting in major portability problems!).</p><p>If the .memdump reports a leak, it displays the allocation function andalso tries to give some informations about the content and structure of theallocated blocks left. This is sufficient in most cases to find the culprit,but not always. Assuming the allocation problem is reproducible, it ispossible to find more easily:</p><ol><li>write down the block number xxxx not allocated</li>  <li>export the environment variable XML_MEM_BREAKPOINT=xxxx , the easiest    when using GDB is to simply give the command    <p><code>set environment XML_MEM_BREAKPOINT xxxx</code></p>    <p>before running the program.</p>  </li>  <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 afternoticing that it was not detecting memory leaks that simple mechanism wasused and proved extremely efficient until now. Lately I have also used <a href="http://developer.kde.org/~sewardj/">valgrind</a> with quite somesuccess, it is tied to the i386 architecture since it works by emulating theprocessor and instruction set, it is slow but  extremely efficient, i.e. itspot memory usage errors in a very precise way.</p><h3><a name="General4" id="General4">General memory requirements</a></h3><p>How much libxml2 memory require ? It's hard to tell in average it dependsof a number of things:</p><ul><li>the parser itself should work  in a fixed amount of memory, except for    information maintained about the stacks of names and  entities locations.    The I/O and encoding handlers will probably account for a few KBytes.    This is true for both the XML and HTML parser (though the HTML parser    need more state).</li>  <li>If you are generating the DOM tree then memory requirements will grow    nearly linear with the size of the data. In general for a balanced    textual document the internal memory requirement is about 4 times the    size of the UTF8 serialization of this document (example the XML-1.0    recommendation is a bit more of 150KBytes and takes 650KBytes of main    memory when parsed). Validation will add a amount of memory required for    maintaining the external Dtd state which should be linear with the    complexity of the content model defined by the Dtd</li>  <li>If you need to work with fixed memory requirements or don't need the    full DOM tree then using the <a href="xmlreader.html">xmlReader    interface</a> is probably the best way to proceed, it still allows to    validate or operate on subset of the tree if needed.</li>  <li>If you don't care about the advanced features of libxml2 like    validation, DOM, XPath or XPointer, don't use entities, need to work with    fixed memory requirements, and try to get the fastest parsing possible    then the SAX interface should be used, but it has known restrictions.</li></ul><p></p><p><a href="bugs.html">Daniel Veillard</a></p></td></tr></table></td></tr></table></td></tr></table></td></tr></table></td></tr></table></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -