解决方案 »

  1.   

    sax解析也会内存溢出?猜测可能还是程序写的有bug,即使层级很多,单个节点很大,也不至于导致内存溢出吧。
      

  2.   

    不是啊,我自己写了一个小的测试程序,这是源代码:package com.xml.test;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;public class SaxHandler extends DefaultHandler {

    @Override 
       public void startDocument() throws SAXException {  
      System.out.println("…………开始解析文档…………\n");
    //         super.startDocument();
        }  
          
       @Override  
        public void endDocument() throws SAXException {  
          System.out.println("\n…………结束解析文档…………");
          
    //          super.endDocument();
        }  
          
        @Override  
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {  
         System.out.println("开始解析元素 " + qName);
        
    //         super.startElement(uri, localName, qName, attributes);
        }  
        
        @Override  
        public void endElement(String uri, String localName, String qName) throws SAXException {  
          System.out.println("结束解析元素  " + qName);
        
    //          super.endElement(uri, localName, qName);  
        }  
          
        @Override  
        public void characters(char[] ch, int start, int length) throws SAXException {  
          String content = new String(ch, start, length);
     
    //          super.characters(ch, start, length);  
        }  
    }public class XmlTest { public static void main(String[] args) throws Exception{
    //实例化SAXParserFactory对象
    SAXParserFactory factory = SAXParserFactory.newInstance();
    System.setProperty("entityExpansionLimit", "1000000");
    //创建解析器
    SAXParser parser = factory.newSAXParser();
    SaxHandler dh = new SaxHandler();
    FileInputStream file = new FileInputStream("dblp.xml");
    BufferedInputStream bis = new BufferedInputStream(file,1024);
    InputSource is = new InputSource(bis);
    parser.parse(is, dh);
    }}这是执行结果时候报的错:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at com.sun.org.apache.xerces.internal.util.XMLStringBuffer.append(XMLStringBuffer.java:205)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.refresh(XMLDocumentScannerImpl.java:1520)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.invokeListeners(XMLEntityScanner.java:2070)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1610)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1657)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1740)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2930)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
    at com.xml.test.XmlTest.main(XmlTest.java:25)
    我在源代码中什么操作都没加,但是还是会内存溢出啊!
      

  3.   

    看看xml文件中是否存在内容特别长的属性值。
      

  4.   

    我的那个xml文件里面有啊,这个有什么联系么?
      

  5.   

    如果有可能就是这个产生的异常,这个我也没有解决办法,好像sax对这种数据处理有问题。