1

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)
4

1 に答える 1

0

1つの簡単な変更:大きな数の代わりにに設定maxOccursします。unbounded(バリデーターが有限状態オートマトンの重量のある表現を構築している場合、現在の宣言には100万の状態が必要ですmaxOccurs="unbounded"。これを、1つの状態に減らします。現在のスキーマが999,999を超えるユーザー要素を持つドキュメントによって引き起こされるエラーを定期的にキャッチする場合は、変更します。もちろん、unbounded検証が弱まります。

于 2012-12-14T17:22:08.637 に答える