본문 바로가기

IT/papers

Fix OOM errors

작성일 : 2010-10-01
작성자 : joanne

 JVM Options
  • 2 OOM errors resolution for FishEye and Confluence
  • 3 references
  • JVM Options

    option description default
    -server or -client -server : 사용자에게 관련된 객체를 오래 유지하는 경우, New 영역의 비율이 높다. -client
      -cleint : 초기 로드되는 객체가 유지되어야 하는 경우가 많은 경우를 상정, Old 영역의 비율이 높다.  
    -Xms 초기 Heap size  
    -Xmx 최대 Heap size  
    -Xmn Young 영역 size  
      -XX:NewSize : Young 영역 초기 size  
      -XX:MaxNewSize : Young 영역 최대 size  
      -XX:NewRatio : Old 영역과 New 영역의 비율 (Old/2 = New)  
    -XX:SurvivorRatio Eden과 survivor의 비율 (Eden/2 = survivor)  
    -XX:+UseParNewGC GC의 동작을 병렬로 실행  
      -XX:+UseConcMarkSweepGC : -XX:+UseParNewGC동작과 함께 사용되며 Full GC에 의해 App가 멈추는 것을 방지하고, App 실행 중 일부를 실행하고, App가 멈출 때 나머지 작업을 진행  
    -Xloggc:<filename> GC 로그를 파일로 기록하는 옵션  
    -XX:+PrintGCDetails GC 로그에 자세히 기록  
    -XX:+PrintGCTimeStamps GC로그 기록시 시간을 기록  
    -XX:+PrintHeapAtGC GC 로그에 Heap 메모리 정보를 기록  

    OOM errors resolution for FishEye and Confluence

    어플리케이션의 OOM 발생의 일반적인 이유

    • 할당된 메모리를 초과
    • physical, virtual memory의 부족
    • 프로그래밍 상의 오류로 너무 많은 메모리를 사용하고 있는 경우
    • 메모리 세팅을 수정하지 않았는데 갑자기 메모리의 사용량이 늘어난 경우
      • 최근 플러그인 업그레이드를 한 경우
      • in memory DB를 사용하는 경우
      • XML 백업을 사용하는 경우

        in momory DB를 사용한다면 external DB로 마이그레이션 하는 것이 바람직 하며 XML 백업을 사용하는 경우 Production 백업 전략을 사용하거나 사용을 자제하도록 하는 것이 좋다.

    ERROR type과 해결 방법

    • JVM 을 사용할 때 메모리 사용에 대한 다양한 제한이 있고, 각 제한에 따른 설정이 가능하다. 각 case가 어떤 제한에 속하는 지 확인해 보야아한다.

    OutOfMemoryError: PermGen space, or Permanent Generation Size

    • 에러 메세지 : OutOfMemoryError: PermGen space, or Permanent Generation Size
    • 발생 이유 : class loading을 위하여 설정된 64MB 블록 사이즈를 초과 ( 보통 플러그인을 과도하게 설치했을 때 발생)
    • 해결 방법 : PermGen memory size를 늘림
    • 예제
      JAVA_OPTS="-Xms128m -Xmx1024m -XX:MaxPermSize=192m $JAVA_OPTS -Djava.awt.headless=true "
      
      • -XX:MaxPermSize=192m : 192m는 플러그인을 많이 설치하더라도 충분한 크기임

    java.lang.OutOfMemoryError: Java Heap Space

    • 에러 메세지 : java.lang.OutOfMemoryError: Java Heap Space
    • 발생 이유 : 사용자 데이터가 많거나, 사용자가 많을 때
    • 해결 방법 : Heap Size를 Xms, Xmx 파라미터를 이용하여 늘린다.
    • 예제
      JAVA_OPTS="-Xms128m -Xmx1024m -XX:MaxPermSize=256m $JAVA_OPTS -Djava.awt.headless=true "
      
      • 최대 heap size를 1024m로 설정할 경우 중간규모의 설치나 배포에 적합하다.
      • 대규모의 사용자가 사용하는 경우 -Xms1024m -Xmx1024m처럼 -Xms와 -Xmx를 같게 하는 것을 권한다.
      • heap size에 너무 많은 공간을 할당하는 것 또한 문제가 될 수 있기 때문에 128m씩 늘려 가면서 테스트 하는 것이 좋다.

    OutOfMemoryError: unable to create new native thread

    • 에러 메세지 : OutOfMemoryError: unable to create new native thread
    • 발생 이유 : JVM이 heap영역에 너무 많은 ram을 차지해서 os가 새로운 thread를 생성할 수 없을 때 발생한다.
    • 해결 방법 : JVM heap의 크기와 각 thread의 stack size를 조절하여야 한다. stack size는 "-Xss512k"를 통해 조정 가능하다.
    • 참고사항
      • 32bit Linux의 JVM은 heap 영역을 2GB 이상 설정할 수 없다.
      • Windows는 사용가능한 물리 메모리를 어플리케이션과 커널 시스템에 50:50 비율로 할당하므로 메모리 설정에 있어 유의하여야 한다.

    OutOfMemoryError: GC overhead limit exceeded

    • Serial, Parallel 이나 Cuncurrent Collector에서 던져지는 메세지
    • 에러 메세지 : OutOfMemoryError: GC overhead limit exceeded
    • 발생 이유
      • JVM 사용 시 메모리를 해제하는 GC 과정의 overhead
      • Xmx(최대 Heap size)값이 너무 클 경우
      • 총 GC 시간의 98% 이상을 사용하여 2% 이하의 Heap 영역을 복구했을 경우
    • 해결 방법
      • Parallel collector를 사용하는 것을 권장
      • 필요한 경우 (총 GC 시간의 98% 이상을 사용하여 2% 이하의 Heap 영역을 복구했을 경우)의 OOM 발생은 -XX:-UseGCOverheadLimit 설정을 통해 발생하지 않도록 할 수 있다.

    OutOfMemoryError: Requested array size exceeds VM limit

    • 에러 메세지 : OutOfMemoryError: Requested array size exceeds VM limit
    • 발생 이유 : 흔하지 않은 에러로 어플리케이션이 Java Heap Size보다 큰 배열을 할당할 경우 발생

    references