개발/Java

힙덤프

728x90
  • Heap
    • 동적으로 할당되어 사용할 수 있는 메모리 영역
      주로 실행중에 생성되는 객체들이 저장되고, 실행 후 제거되는 영역
      GC(Garbage Collection)의 대상의 되는 메모리 영역
      가비지 컬렉터는 가비지 컬렉션을 통해 힙 영역에 있는 사용되지 않는(더이상 참조가 없는) 객체를 회수한다. 
  • 힙 덤프 : 힙 메모리의 내용을 그대로 파일로 떠놓은 것.
    • 주의 : 서버에서 이 파일을 열면 안됨. 서버의 메모리를 사용하여 서버 다운될 수 있다.
  • 메모리 누수
    • 힙 영역에 있는 동적으로 할당된 객체가 더 이상 사용되지 않음에도 불구하고 가비지 컬렉터에 의해 회수되지 않고 메모리에 남아있어서 자리만 차지하는 현상
  • OOM
    • 메모리 부족현상
    • 어플리케이션이 동작하지 못하고 JVM이 종료되는 최악의 상황.
    • 24시간 서비스하는 웹서버 등의 경우 항상 이 메모리 누수 현상이 발생하지 않는지 점검해야 한다.
    • 발생하는 이유
      • Young 영역
        • Eden에서 객체가 생성되고 S0, S1 사이를 왔다갔다 하다가 Old로 가는데, 이 때 객체의 크키가 Eden ,S1, S0보다 크면 발생할 수 도 있다.
      • Old 영역
        • Young 영역에서 오랫동안 GC되지 않고 살아남으면 Old로 넘어가는데 Old 영역의 모든 객체가 여전히 강창조로 남아있다가 더 이상 새로운 객체가 Young영역에서 이동해올 공간이 없을 때 OOM이 발생한다. JVM옵션으로 young, old 비율을 마음대로 조정할 수 있는데 이러한 과정에서 비율 설정이 잘못됐을 경우에도 OOM 발생 가능
      • Permanent(Metaspace) 영역
        • 본 영역은 클래스가 로드되는 영역, 그러므로 크기가 큰 많은 클래스가 로딩될 경우 해당 영역에서도 발생할 수 있다.
        • 일반적으로 발생하기 쉽지 않음.
        • 스프링 MVC같은 웹프레임워크를 사용하는 경우 annotaion, xml, 으로 객체를 생성하는 경우가 있다. 자바에서 이를 weaving이라고 하며, 디버깅이나 트랙잭션, 로깅들에서 다양하게 이용함. 이런 weaving기술들이 편하긴 하지만 버그들을 가지고 있어 클래스를 무한 로딩할 경우 문제가 발생한다.
      • native 영역
        • JVM에는 heap, permanent 영역을 사용하지만 ,JNI나 스레드 쪽은 OS의 메모리를 사용한다. 특히 쓰레드의 경우에는 OS의 쓰레드/스택메모리를 사용하기 때문에 native 메모리가 모자라면 문제 발생 가능.
        • 그외에도 NIO와 같은 native메모리를 바로 사용하는 경우에도 OOM 발생 가능함.
    • 메모리릭 찾는법
      • JVM이 OOM exception으로 정지된 것을 확인
      • 정지된 JVM의 메모리 영역을 확인했더니 특정 영역이 Full로 가득차있었고, GC후 메모리를 할당 받는 것에 실패한 것을 확인
      • 코드레벨에서 바로 수정이 가능한 것인지를 확인한다. 많은 경우 싱글톤이나 스태틱을 잘못 사용했을 경우가 높다
      • JNI, OOM이 나는 경우에는 OS자원 소진일 우려가 있다.
      • 프로젝트 규모가 큰 경우 외부 라이브러리를 적극적으로 사용한 경우 문제 해결이 쉽지 않다. JVM 옵션과 tool의 도움을 받는다
        • --vervose:gc : 로그 자세히 확인 가능
        • -XX:+HeapDumpOnOutMomoryError 추가 : JVM 정지시에 힙덤프를 받아놓을 수 있다.
        • -verbose:class옵션 추가. 클래스로드, 언로드 상황 볼 수 있음
  • 힙덤프 생성 방법
    • SUN Java
    • IMB Java
    •  

'개발 > Java' 카테고리의 다른 글

java.util.collections 총정리 set편  (0) 2021.05.13
Lombok 이란?  (0) 2021.05.12
mixin이란  (0) 2021.05.11
hashCode()  (0) 2021.05.08
자바 스레드 덤프 Thread Dump 분석  (1) 2021.04.26