1

悪意を持って不正な形式のXMLをチェックしたいので、SAX解析が必要です。このライブラリを使用するのは初めてです。

非常に長い名前の属性を含む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と比較して)。

編集:属性名を毎回2倍にすることで、属性名の長さを増やしました。この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)

前もって感謝します

4

3 に答える 3

1

メモリ設定は、Eclipseの[実行]->[構成の実行]にあります。Javaアプリケーションを探し、実行しようとしているクラスの名前を見つけて選択し、[引数]タブをクリックします。[VM引数]セクションの設定は何ですか?空の場合は、VM引数セクションに以下の値を追加してください。

-Xms512M -Xmx1024M

また、 SAXパーサーがOutOfMemoryErrorをスローすることに関するJDK6に関連するバグがあります。影響を受けるバージョンは、アップデート14以前のJDK6です。Javaのバージョンをチェックして、適用されていないことを確認してください。

編集:コメントに基づいて、回答を変更し、VM引数セクションに以下のVM設定を追加することを提案します

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

次に、Eclipse MAT http://www.eclipse.org/mat/などのツールを使用して、ダンプファイルを分析し、実際に何が問題であるかを確認できます。

于 2013-02-26T07:50:39.950 に答える
0

まず第一に、属性名はそれほど長くはないと思います。ヒープサイズを増やしてから確認してください。

java -jar -Xms<min_size> -Xmx<max_size> <ur_jar>
于 2013-02-26T07:39:38.820 に答える
0

非常に大きなXMLファイルを解析できるScaleDOMを確認することをお勧めします: https ://github.com/whummer/scaleDOM

ScaleDOMは、XMLノードの遅延読み込みのため、メモリフットプリントが小さくなります。XMLドキュメントの一部のみをメモリに保持し、必要に応じてソースファイルからノードを再ロードします。

于 2013-09-13T14:22:16.957 に答える