当我们在 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)