Tomcat サーバーにアプリケーションをデプロイすると、スキーマ定義で "maxOccurs" 属性 (つまり maxOccurs="999999") に大きな値を指定するため、java.lang.OutOfMemoryError の問題に直面しました。以下のサンプル スニペットと例外スタック トレースを見つけてください。このシナリオを回避するための最適化されたソリューションを提案してください。
最初は、maxoccurs の値を「unbound」のままにしました。しかし、HP Fortify Static Code Analyzer でコード ベースをスキャンすると、重大な問題があることがわかりました (この問題の詳細については、Fortify リンクを参照してください。左側のパネルには、XML --> 環境 -->弱い XML スキーマ: 制限なし) があります。発生)。したがって、HP Foritfy ツールでは、maxoccurs を適切な数に制限することをお勧めします。ビジネスから承認を得るには、この問題を修正する必要があります。
Java version: JDK 1.6.0_30
Tomcat Version: 6.0
注: ヒープ サイズを増やすことは提案しないでください。私が直面している現在のシナリオは、開発中のTomcatアプリケーションサーバーにありますが、本番Tomcatアプリケーションサーバーではこの問題は見られません(本番サーバーにはより多くのスペースがある可能性があります)
Schema1.xsd
<xs:sequence>
<xs:element name=" User " type=" UserType " maxOccurs="999999"/>
<!-- maxOccurs we specifying large number-->
</xs:sequence>
例外スタック トレース:
Caused by: java.lang.OutOfMemoryError: Java heap space
at org.apache.xerces.impl.dtd.models.CMStateSet.<init>(Unknown Source)
at org.apache.xerces.impl.xs.models.XSDFACM.buildDFA(Unknown Source)
at org.apache.xerces.impl.xs.models.XSDFACM.<init>(Unknown Source)
at org.apache.xerces.impl.xs.models.CMBuilder.createDFACM(Unknown Source)
at org.apache.xerces.impl.xs.models.CMBuilder.getContentModel(Unknown Source)
at org.apache.xerces.impl.xs.XSComplexTypeDecl.getContentModel(Unknown Source)
at org.apache.xerces.impl.xs.XSConstraints.fullSchemaChecking(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
at org.apache.xerces.jaxp.validation.XMLSchemaFactory.newSchema(Unknown Source)
at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:594)
at com.prac.app.common.xmlsupport.SchemaLoaderImpl.init(SchemaLoaderImpl.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)