ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Garbage Collection(가비지 컬렉션) 의 개념 및 동작 방법
    Java 2021. 6. 9. 07:41

    Garbage Collection이란 무엇일까요?

    그대로 번역하면 쓰래기를 수집한다라는 뜻입니다.

    프로그램이 동적으로 할당했던 메모리 영역 중에서 필요 없게 된 영역을 쓰래기라고 취급하고, 이것을 해제합니다.

    C언어를 이용하면 free()라는 함수를 통해 직접 메모리를 해제해줘야 되지만, JVM기반의 Java나 Kotlin을 이용하면 메모리를 개발자가 직접 해제해주는 일은 없습니다. 그 이유는 JVM의 가비지 컬렉터 덕분입니다.

     

    예를 들어 아래와 같은 코드가 있다고 가정해보겠습니다.

    Member meber = new Member("name");
    member = null;
    // 가비지 발생

    Member 로 생성된 객체는 더이상 참조하지 않고 사용이 되지 않아서 Garbage 가 되었습니다.

    JVM은 메모리 누수를 방지하기 위해 가비지 컬렉터 (Garbage Collector) 가 주기적으로 검사하여 메모리를 청소해줍니다.

    Java 코드에서 System.gc()를 호출하면 강제적으로 메모리를 청소하게 만들 수 있습니다. 하지만 해당 함수는 시스템에 큰 영향을 미치므로 호출하면 안됩니다.

     

    Minor GC와 Major GC

    Heap영역은 처음 설계될 때 2가지를 전제 (Weak Generational Hypothesis) 로 설계 되었다.

     - 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다.

     - 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.

    즉 객체는 대부분 일회성이며 메모리에 오래 남아있는것이 드물다는 이야기입니다.

     

    그렇다면 어떤 기준으로 GC가 발생하고 메모리를 청소해줄까요?

    그걸 이해하기 위해서는 Minor GC, Major GC 를 알면 이해할 수 있습니다.

    최초로 값이 Eden영역에 들어가게 되고 GC 발생시 Unreachable 한것은 제거되고 아닌것은 Servivor 0 영역으로 들어가게 됩니다.

    GC가 일어났을때 Survivor0 에 Unreachable 한것이 없다면 Survivor1로 들어가게 되고 다 살아남게 되면 Old 영역으로 들어갑니다.

     

    Minor GC는 Eden, Survivor0, Survivor1 영역에서 GC가 일어낫을때를 말하고,

    Major GC는 Old 영역에서 GC가 일어났을때를 말합니다.

     

    그렇다면 GC 가 발생한다면 어떤 일이 일어날까요?

    GC가 발생할 경우 GC를 실행 하기 위한 쓰레드를 제외한 나머지 쓰레드들은 모두 작업을 멈춥니다.

    GC작업이 완료된 이후 작업을 다시 시작합니다.

    이것을 Stop The World 라고 말합니다.

     

    Minor GC의 경우 0.5 초 내로 빨리 끝나지만 Major GC의 경우 Full GC를 하기 때문에 속도가 많이 걸리게 됩니다.

    그 기간동안 쌓였던 요청들이 한번에 들어오면서 시스템 장애가 발생할 수 있습니다.

     

Designed by Tistory.