JVM 정리

Posted by hyeoni90 on November 12, 2020 · 2 mins read

JVM 정리

JVM Heap 메모리 구조

  • Young, Old 영역으로 나뉜다.
    • Young 영역은 Eden, Survivor 영역으로 구성,
      • Eden: Object 가 Heap 에 최초로 할당 되는 장소
        • Eden 영역이 꽉 차게 되면 Object 참조 여부를 따져 만약 참조가 되어 있는 Live Object 면 Survivor 영역으로 넘기고, 참조가 끊어진 Garbage Object이면 그냥 남겨 놓는다. 모든 Live Object 가 Survivor 영여긍로 넘어가면 Eden영역을 모두 청소한다.
      • Survivor: Eden 영역에서 살아남은 Object 들이 잠시 머무르는 곳
        • Minor GC: Survivor 영역은 2개로 구성되는데 Live Object를 대피 시킬 때는 하나의 Survivor 영역만 사용하게 됨. 전반 적인 과정을 뜻함!!
      • Young 영역에서 오래 남아 성숙된 Object(특정 회수 이상 참조되어 기준 age를 초과한 object 말함) 는 Old 영역으로 이동
    • Old 영역은 비교적 오랫동안 참조가 되어 이용 되고 있고 앞으로도 계속 사용될 확률이 높은 Object들을 저장하는 곳

    • Full GC(Major GC): Promotion 과정 중 Old 영역 메모리도 충분하지 않으면 해당 영역에도 GC발생!

GC 관련 장애 발생 유형의 원인 및 해결 방안

OOME(Out Of Memory Error) : JVM이 Heap Memory를 더이상 Object를 할당할 수 없을 때 발생하는 오류! 2가지 유형으로 크게 구분할 수 있다.

  • OOME: java heap space
    • Heap memory공간이 부족하여 발생. ⇒ 공간 부족의 원인으로는 Heap memory의 크기가 작아서 발생하는 경우와 애플리케이션 문제로 발생하는 경우가 있음.

    • 해결방안)

      • -Xmx 옵션을 사용해서 Heap memory 크기를 증가 시키는 방법 → 이는 GC time의 증가르 동반하기 때문에 충분한 사전 테스트 필요
      • 애플리케이션 프로파일링 → Heap Dump 분석을 기반으로 쓸데 없이 많은 Memory 를 사용하거나 Memory leak 유발하는 로직을 찾아내어 수정한다.
  • OOME: PerGem space
    • Java Heap memory 영역 중 Permanent영역은 String pool, Class Method 과 연관된 각종 Meta Data 등을 저장하는 용도로 사용.
    • JVM 기동 시 로딩되는 Class or String 수가 많다면 해당 오류의 원인 된다.
    • 또한 Classloader leak에 의해 발생될 수 있음

    • 해결 방안)
      • JVM 튜닝!!
      • 일반 비즈니스 프로그램으로 핸들링할 수 없기 때문에 JVM 튜닝으로도 해결이 되지 않는다면, WAS or JDK 버그를 의심해 봐야한다!
      • VisualVM JDK6 부터 제공되는 툴로 실행 중인JVM에 대해 자세한 정보를 GUI로 제공해줌. Thread 모니터링, JVM memory 모니터링, Thread dump 및 head dump 생성 등

References