Tomcat 서버에 응용 프로그램을 배포 할 때 은 "maxOccurs"에 큰 값을 지정하므로 java.lang.OutOfMemoryError 문제가 발생했습니다. "속성 (즉, maxOccurs ="999999 ")은 스키마 정의에 있습니다. 아래 샘플 스 니펫과 예외 스택 추적을 찾으십시오. 누군가이 시나리오를 피하기 위해 최적화 된 솔루션을 제안 해주십시오.XSD (maxOccurs = (큰 값 지정)) - java.lang.OutOfMemoryError : Java 힙 공간
처음에는 maxoccurs 값을 "언 바운드"로 유지했습니다. 그러나 HP Fortify 정적 코드 분석기로 코드 기반을 검사 할 때 중요한 문제가 있음을 발견했습니다 (문제에 대한 자세한 내용은 Fortify Link, 왼쪽 패널에는 XML -> 환경 ->약한 XML 스키마 : 제한 없음 발생). 따라서 HP Foritfy 도구 은 maxoccurs를 적당한 수로 제한 할 것을 권장합니다. 우리는이 문제를 해결해야 비즈니스에서 사인을 얻을 수 있습니다.
Java version: JDK 1.6.0_30
Tomcat Version: 6.0
참고 : 힙 크기를 늘리십시오. 내가 직면하고 현재의 시나리오는 (프로덕션 서버가 더 많은 공간을 가지고있을 수 있습니다)
Schema1.xsd
<xs:sequence>
<xs:element name=" User " type=" UserType " maxOccurs="999999"/>
<!-- maxOccurs we specifying large number-->
</xs:sequence>
예외 스택 추적 생산 바람둥이 응용 프로그램 서버에 나는이 문제가 표시되지 않습니다 개발 Tomcat 응용 프로그램 서버에 있습니다
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)
maxoccurs를 언 바운드로 설정할 수없는 이유는 무엇입니까? – user1635014
999999를 99로 변경해 보았습니까? 정말 도움이 되겠습니까? 실제로 얼마나 많은 'User'가 발생합니까? 실제로 100 만 개의 User 요소를 처리 할 수 있습니까? 그렇다면이 응용 프로그램에서 실제로 안전하지 않은 '무한대'입니까?) 또는 maxOccurs를 999999로 설정하는 중입니다. 요새화에 대한 경고는 실제로 제기 된 보안 문제에 대해 생각하지 않고 사라지겠습니까? –