2012-12-14 6 views
1

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) 

답변

0

하나의 간단한 변경 : 큰 숫자 대신 maxOccurs에서 unbounded으로 설정하십시오. (유효성 검사기가 유한 상태 오토 마톤의 중량 표시를 작성하는 경우 현재 선언문에 백만 개의 상태가 필요하며 maxOccurs="unbounded"은 하나의 상태로 줄입니다. 현재 스키마가 999,999 개 이상의 사용자 요소가있는 문서로 인해 발생하는 오류를 일상적으로 발견하는 경우, unbounded으로 변경하면 유효성이 약해질 것입니다.

+0

maxoccurs를 언 바운드로 설정할 수없는 이유는 무엇입니까? – user1635014

+0

999999를 99로 변경해 보았습니까? 정말 도움이 되겠습니까? 실제로 얼마나 많은 'User'가 발생합니까? 실제로 100 만 개의 User 요소를 처리 할 수 ​​있습니까? 그렇다면이 응용 프로그램에서 실제로 안전하지 않은 '무한대'입니까?) 또는 maxOccurs를 999999로 설정하는 중입니다. 요새화에 대한 경고는 실제로 제기 된 보안 문제에 대해 생각하지 않고 사라지겠습니까? –

관련 문제