java - SAX 解析器 - OutOfMemoryError : Java heap space

标签 java sax out-of-memory saxparser

我需要 SAX 解析,因为我想检查恶意格式错误的 XML。这是我第一次使用这个库。

我创建了一个 XML 文件 (18MB),其中包含一个名称非常非常长的属性。

    <?xml version="1.0"?>
    <company>
        <staff>
            <firstname VERYLONGATTRIBUTENAME...VERYLONGATTRIBUTENAME="some value"> 
yong</firstname>
        <lastname>mook kim</lastname>
        <nickname>mkyong</nickname>
        <salary>100000</salary>
    </staff>
    <staff>
        <firstname>low</firstname>
        <lastname>yin fong</lastname>
        <nickname>fong fong</nickname>
        <salary>200000</salary>
    </staff>
</company>

我只是这样调用 SAXParser

saxParser.parse("test.xml", handler);

所有事件处理程序都是完全空的。但是发生了OutOfMemoryError:Java堆空间。 为什么会出现这种情况?我选择 SAX 是因为它是基于流/事件的,并且在处理此类问题时不会有问题(与 DOM 相比)。

编辑:我每次都将属性名称的长度加倍。它一直有效,直到我到达这个 18MB 的文件。

编辑2:堆栈跟踪

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2882)
    at java.lang.StringValue.from(StringValue.java:24)
    at java.lang.String.<init>(String.java:178)
    at com.sun.org.apache.xerces.internal.util.SymbolTable$Entry.<init>(SymbolTable.java:338)
    at com.sun.org.apache.xerces.internal.util.SymbolTable.addSymbol(SymbolTable.java:178)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanName(XMLEntityScanner.java:726)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanAttribute(XMLDocumentFragmentScannerImpl.java:1523)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1320)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2756)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
    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:119)
    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 javax.xml.parsers.SAXParser.parse(SAXParser.java:277)
    at com.thundercloud.httpfilter.XMLParser.test(XMLParser.java:150)
    at com.thundercloud.httpfilter.HTTPInterceptor.main(HTTPInterceptor.java:34)

提前致谢

最佳答案

您可以在 Eclipse Run->Run Configuration 中找到内存设置。查找 Java 应用程序并找到您尝试运行的类的名称,选择它,单击“参数”选项卡。 VM Arguments 部分中的设置是什么?如果为空,请将以下值添加到 VM Arguments 部分。

-Xms512M -Xmx1024M

此外,还有一个与 JDK6 有关的错误 SAX parser throws OutOfMemoryError 。受影响的版本是更新14之前的JDK6。请检查您的Java版本以确保它不适用于您。

编辑:根据评论,我修改了我的答案并建议在 VM 参数部分添加以下 VM 设置

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="c:\temp\oomdump.hprof"

然后您可以使用 Eclipse MAT http://www.eclipse.org/mat/ 等工具分析转储文件以查看真正的问题

关于java - SAX 解析器 - OutOfMemoryError : Java heap space,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15083073/

相关文章:

java - 用于 json 的日期格式

java - 使用 SAX 解析器解析 Xml

Android OutOfMemoryError :?

haskell - 在 Haskell 的 ST Monad 中高效记录字符串数据

Linux 服务器 | Tomcat 7.0 异常

java - eclipse gradle spring mvc tomcat 构建

java - 如何像在 Google Oauth Playground 中一样向 Google API 发送 HTTP 请求?

java - 嵌套类型的通配符

java - 将 byte[] 馈送到 SAXParser

Java SAXParser 误报