[
http://issues.apache.org/jira/browse/XERCESC-1589?page=comments#action_12376182
]
Rinil Baxi commented on XERCESC-1589:
-------------------------------------
We have an application that creates response XML on fly for communication.
The problem we are facing is that memory is not being released when we release
DOMBuilder. We tried using various different ways of releasing memory including
resetDocumentPool( ), release( ) and even Terminate( ) but alas no luck. We
have
also found few excerpts on web talking about this issue and saying that
it depends on garbage collector policies.
The test case provided here can easily reproduce the problem.
> XML DOM parser does not release memory on parser:release and
> resetDocumentPool()
> --------------------------------------------------------------------------------
>
> Key: XERCESC-1589
> URL: http://issues.apache.org/jira/browse/XERCESC-1589
> Project: Xerces-C++
> Type: Bug
> Components: DOM
> Versions: 2.4.0
> Environment: HP-Tandem-NonStop Kernel
> Reporter: Rinil Baxi
>
> 1) Use the following code:
> /home/Rinil/Xml/dom [2441]: more mleak.cpp
> #include < string.h>
> #include < cextdecs.h>
> #include < iostream>
> #include < xercesc/util/PlatformUtils.hpp>
> #include < xercesc/parsers/AbstractDOMParser.hpp>
> #include < xercesc/dom/DOMImplementation.hpp>
> #include < xercesc/dom/DOMImplementationLS.hpp>
> #include < xercesc/dom/DOMImplementationRegistry.hpp>
> #include < xercesc/dom/DOMBuilder.hpp>
> #include < xercesc/dom/DOMException.hpp>
> #include < xercesc/dom/DOMDocument.hpp>
> #include < xercesc/dom/DOMNodeList.hpp>
> #include < xercesc/dom/DOMError.hpp>
> #include < xercesc/dom/DOMLocator.hpp>
> #include < xercesc/dom/DOMWriter.hpp>
> #include < xercesc/framework/StdOutFormatTarget.hpp>
> #include < xercesc/framework/LocalFileFormatTarget.hpp>
> #include < xercesc/framework/MemBufInputSource.hpp>
> #include < xercesc/framework/Wrapper4InputSource.hpp>
> #include < xercesc/parsers/XercesDOMParser.hpp>
> #include < xercesc/util/XMLUni.hpp>
> #include < xercesc/util/XMLException.hpp>
> unsigned long getMemUsage ()
> {
> short gError = 0;
> short myHandle[10];
> short attrList[10];
> short valList[10];
> short valMaxLen = 10;
> short valLen = 0;
> short attrs = 0;
> unsigned long *memUsage;
> gError = PROCESSHANDLE_GETMINE_ (&myHandle[0]);
> if (gError)
> return 0;35%)
> memset (&attrList[0], '\0', 10);
> memset (&valList[0], '\0', 10);
> attrList[attrs] = 111;
> attrs++;
> gError = PROCESS_GETINFOLIST_
> (,,,,&myHandle[0]
> ,&attrList[0]
> ,attrs
> ,&valList[0]
> ,valMaxLen
> ,&valLen
> );
> if (gError)
> return 0;
> memUsage = (unsigned long *) (&valList[0]);
> return *memUsage;
> }
> int main()
> {
> DOMImplementation *impl;
> DOMBuilder *parser;
> DOMDocument *doc;
> const XMLCh gLS[] = { chLatin_L, chLatin_S, chNull };
> std::cout < < "\nMEMUSAGE at Start : "< < getMemUsage();
> // Initialize the XML system
> try {
> XMLPlatformUtils::Initialize();
> XMLPlatformUtils::recognizeNEL(false);
> }
> catch (const XMLException& toCatch) {
> return 1;
> }
> impl = DOMImplementationRegistry::getDOMImplementation(gLS);
> parser =
> ((DOMImplementationLS*)impl)->createDOMBuilder(DOMImplementationLS::MODE_SYNCHRONOUS,
> 0);
> if (parser == NULL) {
> //Its known that XML system must be terminated before returning
> return 1;
> }
> parser->setFeature(XMLUni::fgDOMNamespaces,true);
> parser->setFeature(XMLUni::fgXercesSchema, false);
> parser->setFeature(XMLUni::fgXercesSchemaFullChecking, false);
> parser->setFeature(XMLUni::fgDOMValidateIfSchema, false);
> parser->setFeature(XMLUni::fgDOMDatatypeNormalization, true);
> //Reset Document Pool
> parser->resetDocumentPool();
> std::cout< < "\nMEMUSAGE before parsing: "< < getMemUsage();
> //Parse XML and get document
> try{
> doc = parser->parseURI("personal.xml");
> }
> catch(DOMException dome){
> //Its known that XML system must be terminated before returning
> return 1;
> }
> std::cout< < "\nMEMUSAGE after parsing: "< < getMemUsage();
> //Reset Document Pool
> parser->resetDocumentPool();
> std::cout< < "\nMEMUSAGE after resetDocumentpool(): "< < getMemUsage();
> //Release Parser
> //This should also release DOMDOcument associated i.e. doc
> parser->release();
> std::cout< < "\nMEMUSAGE after parser release(): "< < getMemUsage();
> XMLPlatformUtils::Terminate();
> std::cout< < "\nMEMUSAGE after Terminate(): "< < getMemUsage()< < std::endl;
> return 0;
> }
> /home/Rinil/xml/dom [2442]:
> 2) Compile using Makefiles provided with XML samples.
> 3) Place a xml file to be parsed in the CWD. ie personal.xml which comes with
> the samples.
> 4) run mleak:
> /home/RinilXml/dom [2452]: ./mleak
> MEMUSAGE at Start : 16384
> MEMUSAGE before parsing: 57344
> MEMUSAGE after parsing: 245888
> MEMUSAGE after resetDocumentpool(): 245888
> MEMUSAGE after parser release(): 245888
> MEMUSAGE after Terminate(): 245888
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]