java.lang.StackOverflow 오류

이 오류가 발생하는 이유와 이를 방지할 수 있는 방법은 무엇입니까?

증상

애플리케이션을 실행하는 동안 java.lang.StackOverflowError가 표시됩니다.

원인

Java 프로그램 또는 JVM(Java Virtual Machine)에서 작성되는 모든 스레드에는 Java 힙과 관계가 없는 고유 스택 공간이 있습니다. 애플리케이션에 사용 가능한 전체 스택 크기는 시작 동안 판별되고 해당 값은 포함할 수 있는 스레드 수를 판별하며 이를 초과하면 다음과 같이 java.lang.StackOverflowError가 발생합니다.

com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0068E: Uncaught exception created in one of the service methods of the servlet utils.secure_invoker in application ccd_mdmprod-appsvr. Exception created : com.ibm.websphere.servlet.error.ServletErrorReport: java.lang.StackOverflowError
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:695)
at utils.secure_invoker._jspService(Unknown Source)
at com.ibm.ws.webcontainer.jsp.runtime.HttpJspBase.service(HttpJspBase.java:103)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1657)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1597)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:104)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908)

문제점 해결

이 오류를 방지하려면 애플리케이션에서 사용 가능한 스택 크기를 증가시켜야 합니다. 해당 작업을 수행하는 단계는 다음과 같습니다.
  1. conf 디렉토리에서 service_mem_settings.ini 파일을 찾으십시오. 이 디렉토리는 일반적으로 $TOP/bin 디렉토리 아래 있지만 수평적 클러스터링이 있는 경우 사용자 정의 위치에 있을 수도 있습니다.
  2. 이 파일은 다양한 서비스에 대한 JVM 인수를 포함합니다. 예를 들어, 애플리케이션 서버 프로세스에 대해서는 다음과 같은 플래그를 포함합니다. APPSVR_MEMORY_FLAG=-Xmx1024m -Xms256m
    위의 엔트리는 최대 힙 크기가 1024MB이고 기본 시작 힙 크기가 256MB인 것을 보여줍니다. 힙 크기를 증가시키기 위해 다음과 같이 다른 -Xss 인수를 추가할 수 있습니다.

    APPSVR_MEMORY_FLAG=-Xmx1024m -Xms256m -Xss2048k

    위의 엔트리는 스택 크기를 2MB로 설정하며 이 값이 충분하지 않으면 추가로 늘릴 수 있습니다. 이는 애플리케이션 서버만이 아니라 모든 서비스에 적용할 수 있습니다.

  3. $TOP/bin/go 디렉토리 아래의 스크립트를 사용하여 애플리케이션을 재시작하십시오.
    참고:
    1. 대형 데이터 모델이 없는 한 이 문제는 드물게 일어납니다. 보통은 기본값이 충분합니다.
    2. 기본 스택 공간을 매우 큰 값으로 설정하면 성능 저하를 초래할 수 있습니다. 2MB부터 시작하고 필요에 따라 값을 증가시키십시오.


마지막 업데이트 날짜: 2019년 3월 12일