ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] JVM과 GC 메모리 관리
    Programming/Java 2021. 4. 5. 12:52
    • JVM(Java Virtual Machine, 자바가상머신)

      OS의 메모리 영역에 접근하여 메모리를 관리하는 프로그램으로, 메모리관리와 Garbage Collecting 기능을 수행한다.
    • GC(Garbage Collector, 가비지 컬렉터)

      동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능을 수행한다.

     

     

    JVM의 메모리관리

    참고자료

     C나 C++에서는 OS레벨의 메모리에 직접 접근하기 때문에, free() 메소드를 호출하여 할당받은 메모리를 해제해주어야 한다. 그렇지 않으면 메모리 누수가 발생하여 프로그램의 응답속도가 늦어지다 결국 OOM(OutOfMemory) 오류로 프로그램이 종료되고, 다른 프로그램에 영향을 끼칠 수도 있다.

     반면, 자바는 OS의 메모리 영역에 직접 접근하지 않고, JVM이라는 가상머신을 통해 간접적으로 접근한다. JVM은 C로 쓰여진 프로그램으로, 오브젝트가 필요해지지 않는 시점에서 알아서 free()를 수행하여 메모리를 확보한다.

     프로그램 실행시 JVM 옵션을 주어서 OS에 요청한 사이즈 만큼의 메모리를 할당 받아 실행하게 된다. 할당받은 메모리 이상을 사용하게 되면, 에러가 나면서 자동적으로 프로그램이 종료된다. 그러므로 현재 프로세스에서 메모리 누수가 발생하더라도 현재 실행중인 프로그램만 죽고, 다른 프로그램에는 영향을 끼치지 않는다.

     이렇게 자바는 가상머신을 사용함으로써 OS레벨에서의 memory leak이 불가능하게 된다는 장점이 있다.



     

    Garbage Collecting 과정

    Heap영역에서 더 이상 사용되지 않는 오브젝트를 찾아, 가비지 컬렉션을 담당하는 프로세스가 자동으로 메모리에서 제거한다.

    stack과 heap

    • Stack : 정적으로 할당한 메모리 영역
      • 원시 타입의 데이터가 값과 함께 할당된다.
      • Heap영역에 생성된 오브젝트 타입 데이터의 참조값이 할당된다.
    • Heap : 동적으로 할당한 메모리 영역
      • 모든 오브젝트 타입의 데이터가 할당된다.

     

     

    runtime시 stack과 heap에 메모리 할당

    image

    • 원시 타입의 데이터의 경우 변수와 값이 모두 stack에 저장
    • 오브젝트타입인 string형 데이터는 변수(참조값)는 stack에 값(실제값)은 heap에 저장

    사용 종료시

    • 실행이 종료되면 stack에 할당되었던 데이터는 삭제
    • 하지만, heap 영역에 할당된 데이터는 삭제되지 않고 남아있고, 이것을 Unreachable Object라고 부름

    gc 처리과정

    참고자료

    1. Mark
    • Garbage collector가 stack의 모든 변수를 스캔하며, 각각 어떤 객체를 참조하고 있는지 찾아 마킹
    • Reachable Object가 참조하고 있는 객체도 찾아서 마킹
    1. Sweep
    • 마킹되지 않은 객체를 Heap에서 제거


    java 1.8이후 Heap 영역 구조

    참고자료

    image

    • 크게 Young generation과 Old Generation으로 나뉨
    • Young Generation은 Eden영역과 Survivor영역으로 구성



    GC의 메모리 관리 과정

    참고자료

    1. Eden -> Survivor
    • Object가 생성되면, Eden 영역에 최초로 할당
    • Eden 영역의 메모리가 꽉차면, Object의 참조여부를 따져서 이동.
      • stack에 참조가 되어있는 Reachable Object(Live Object)인 경우, Survivor영역으로 넘김
      • stack에 참조가 되어있지 않은 Unreachable Object인 경우, 그냥 남겨 놓음
    • Object 이동이 끝나면, Eden 영역을 모두 청소

     

    1. Survivor0/1 -> Survivor1/0 (Minor GC)
    • Survivor영역은 말 그대로 Eden영역에서 살아남은 Object들이 잠시 머무르는 곳
    • Live Object를 대피시킬 때는 하나의 Survivor 영역만 사용
    • Survivor 0/1영역의 메모리가 꼭차면, Object의 참조여부를 따져서 Survivor1/0으로 이동. (1번 과정과 동일)
    • 이동한 객체는 Age값 증가

     

    1. Survivor -> Old Generation (Major GC)
    • Young Generation에서 오래 살아남아 기준 Age를 초과한 Object는 Old Generation으로 이동. 이를 Promotion이라고 부름.
    • Old Generation영역은 새로 Heap에 할당되는 Object가 들어오는 것이 아니라, 비교적 오랫동안 참조되어 이용되고 있고 앞으로도 계속 사용될 확률이 높은 Object들이 저장되는 영역.
    • 이러한 Promotion 과정 중 Old Generation의 메모리가 꽉차면, Full GC(Major GC)가 발생




    참고자료

    댓글

Designed by black7375.