본문 바로가기
Troubleshooting

OutOfMemory 발생 시 문제해결 프로세스

by 샤워하다돌면워싱턴 2022. 8. 30.
반응형

java.lang.OutOfMemoryError: Java Heap Space
  • 한정된 힙 영역에 대량의 데이터를 가져오는 행위 : sql조건 축소, 32비트->64비트 변경 후 힙 사이즈 증가
  • 애플리케이션의 불필요한 행위 : 이미 가져온 데이터를 다른 객체로 복사해 사용하는 행위.
  • 작은 힙 사이즈 : 애플리케이션의 수정과 데이터의 증가에 비해 작은 힙 메모리를 사용하는 경우 늘려줘야 한다.
  • 메모리 leak : 지속적 참조객체로 인해 gc수행 시 제거되지 않는 현상으로 애플리케이션 수정이 필요.
java.lang.OutOfMemoryError: PermGen space
  • 펌 영역 부족 현상으로 적정한 값을 차지 못하는 경우 최솟값과 최댓값을 다르게 하여 gc로그를 통해 적정 값을 찾는다. 간혹 릭이 발생하는 경우 힙덤프 분석.
    -XX:Permsize=256m -XX:MaxPermSize=512m
java.lang.OutOfMemoryError: requested 793020 bytes for Chunk::new. Out of swap space?
java.lang.OutOfMemoryError: unable to create new native thread
java.lang.StackOverflowError
  • 힙 메모리 외에 플랫폼에서 지정하는 메모리 공간에 대한 부족현상
  • 32비트 환경에서는 힙사이즈 축소
  • 64비트 환경으로 전환하는 방법
  • 애플리케이션 반복문의 횟수 검토
  • -Xss를 사용해 스택 사이즈를 조절하는 방법
java.lang.OutOfMemoryError: allocLargeObjectOrArray - Oject size: 372032, Num elements: 372012
  • Large Object의 제한 값으로 인해 발생하는 경우가 있으며 메모리 릭이 원인일 수도 있다. 
  • 자바 옵션 -XXlargeObjectLimit:<값>으로 조절
java.lang.outofmemoryerror: nativeGetNewTLA
  • 스레드 로컬 영역에 할당되는 스레드 로컬 변수에 대한 사용이 많아지거나 사용 후 데이터를 삭제하지 않아 발생.
  • 애플리케이션에서 스레드 로컬 변수 사용에 대한 확인이 필요
  • -XXtlasize:<값>을 사용해 조절
java.lang.OutOfMemoryError: GC overhead limit exceeded
  • jdk6환경에서 GC overhead limit exceeded는 OOME조건을 힙 공간이 부족하기 전에 미리 예측하여 OOME를 발생
  • 작업중인 스레드를 중지시킴
  • 이러한 작업은 JVM이 OOME로 인한 행 업이 발생하기 전 에러를 발생시켜 JVM이 완전히 멈추기 전에
    데이터 수집과 힙덤프, 스레드 덤프를 남기게 하나 해결까지는 아님
  • 객체의 크기가 큰 애플리케이션의 경우 이런 형태의 OOME가 발생할 확률이 높기 때문에
    -XX:-UseGCOverheadLimit옵션을 주어 이 정책을 사용하지 않게 설정하기도 한다.
 
힘 덤프
메모리를 분석하기 위해 메모리 단면, 힙 덤프 파일이 필요.
  • objects : class, filed, primitive value, references
  • classes: class loader, name, super class, static fileds
  • gc root : jvm상에서 접근 가능한 객체
  • Thread Stack
  • Local 변수
-XX:+HeapDumpOnOutOfMemoryError옵션을 자바 옵션에 적용하면 OOME발생 시 자동으로 힙 덤프를 생성시킨다.
-XX:HeapDumpPath=<dump file>형태로 자바 옵션에 적용하면 덤프파일 위치에 힙 덤프 생성
-XX:HeapDumpOnCtrlBreak를 적용하면 리눅스 환경에서는 k -3 <pid> 수행 시 스레드 덤프와 함께 힙 덤프가 생성된다.
 
XX:HeapDumpOnCtrlBreak옵션을 적용하면 jvm 기동이 안되는 경우가 있음 -> jmap유틸리티 제공
jdk 1.5   : $JAVA_HOME/bin/jmap -heap:format=b <pid>
jdk 1.6+ :  $JAVA_HOME/bin/jmap -dump:format-b,file=<dump file> <pid>
생성된 힙 덤프는 hprof, phd 확장자을 갖고
jdk에서 제공하는 jhat, IBM의 힙 분석기, 이클립스의 메모리 분석기를 사용
 
Permanent GC
OOME발생 시 네이티브와 Perm영역에 대한것은
  • 버퍼, 룩업 테이블, zip파일 작업
  • Swing.AWT의 네이티브 gui관련 버퍼와 구조체
  • JNI코드로 사용된 데이터
  • JIT컴파일러와 관련코드
  • MI(Mixed-Mode-Interpreter)함수
  • 일부 스레드
반응형

댓글