1

当我们在 tomcat 服务器上部署应用程序时,我一直面临 java.lang.OutOfMemoryError 问题,因为我们在模式定义中为“maxOccurs”属性(即 maxOccurs="999999")指定了较大的值。请在下面找到示例片段和异常堆栈跟踪。有人可以建议优化解决方案来避免这种情况。

最初,我们将 maxoccurs 值保持为“未绑定”。但是,当我们使用 HP Fortify 静态代码分析器扫描代码库时,我们发现存在严重问题(有关该问题的更多信息,请访问:Fortify Link,在左侧面板上我们有 XML-->Environment--> Weak XML Schema: Unbounded发生)。所以 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

一个简单的更改:设置maxOccursunbounded而不是一个大数字。(如果验证器正在构建有限状态自动机的重量级表示,那么您当前的声明需要一百万个状态;maxOccurs="unbounded"将其减少到一个状态。如果您当前的模式经常捕获由超过 999,999 个用户元素的文档引起的错误,则更改当然, tounbounded会削弱你的验证。

于 2012-12-14T17:22:08.637 回答