GC가 무엇인지, 필요한 이유는 무엇인지, 동작방식에 대해 설명해주세요.

    키워드

    • GC가 무엇인지
    • JVM의 어떤 영역에서 작동하는지
    • GC의 장점은? - 메모리 누수
    • 왜 GC를 도입하게 되었는지? - managed Language
    • Mark and sweep - GC Roots
      • Unreachable
    • Heap 영역의 구조 - Young Generation - Minor GC | Old Generation -Major GC
    • 참조 카운팅
    • GC의 종류 - Stop the world - Serial GC

    GC는 가비지 콜렉션의 약자로, JVM의 Heap영역에서 사용하지 않는 객체를 삭제하는 프로세스를 의미합니다. 즉,자동으로 메모리를 관리해주는 작업의 총칭이며, 메모리 누수== memory Leak 를 막아 안정적인 프로그래밍이 가능합니다. C언어등과 같은 오래된 언어에서는 개발자가 직접 메모리 관리를 해야했지만, 자바와 같이 새로운 언어들은 GC를 도입했고, 이렇게 자동으로 메모리를 관리하는 언어를 managed Language라고 합니다.

     

    GC Roots에서부터 각각 참조하고 있는 객체들을 하나씩 탐색해나갑니다. 이때 참조되지 않는 객체는 Unreachable하다고 표현하며, 이는 GC의 대상이 됩니다.

     

     

    Mark and Sweep 알고리즘을 이용하여 동작합니다. Mark는 GC Root로부터 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 알아서 마킹합니다. 즉, reachable한 객체와 unreachable한 객체를 식별하는 과정이라고 할 수 있습니다. 그 다음 Sweep과정은 unreachable한 객체을 Heap에서 제거하는 과정입니다.

     

    필요한 것들만 mark한 다음에 mark가 되지 않은 것들은 버리는 방식.

    프로그래밍 측면에서 보면 루트에서 닿지 않는 변수들을 치우는 것입니다.

     

    Heap의 구조

    Yong Generation, Old Generation으로 구분이 되며,

     

    Yong Generation새로운 객체들이 할당되는 영역이며,

    Old Generation은 Young Generation에서 오랫동안 살아남은 객체들이 존재하는 영역입니다.

    그리고 Young Generation은 Eden, Survivor 0, Survivor 1로 나뉘어집니다.

    새로운 객체가 에덴 영역에 할당이 됩니다. 그리고 더이상 할당될 곳이 없다면, 그러면 이때 Minor GC가 발생합니다. Minor GC가 발생하면 Mark and sweep 과정이 일어납니다. 여기서 마킹된 객체들은 서바이벌 영역으로 이동됩니다. 그리고 sweep으로 인해 unreachable한 객체들은 지워집니다. 이때 서바이벌 영역에 있는 살아남은 객체들은 age가 증가합니다.

    그때, age값이 특정 인계점에 도달하게 되면, Old Generation으로 이동하게 됩니다. age값이 높은 객체들로 Old Generation이 꽉차게 되면 Major GC가 일어납니다.

     

    Reference Count

    참조 카운팅입니다. 이는 한 요소가 어느 한 요소에게 몇 번 참조가 되는지 세어서 그 수가 0이 되면 정리하는 방식입니다.

     

    Stop the World

    GC를 실행하면 GC를 실행하는 쓰레드 외의 모든 쓰레드가 작업을 중단하는 개념입니다. GC 종류에 따라서 Stope the world가 발생하는 시간이 다릅니다.

     

    Serial GC는 가장 단순하고 기본적인 GC입니다. GC를 처리하는 쓰레드가 1개이고 stop-the-world의 시간이 깁니다.

    Parallel GC는 Java 8의 default GC이며, Young 영역의 GC를 멀티 쓰레드로 수행합니다.

    Paraller Old GC는 Parallel GC를 개선했으며 Old 영역에서도 멀티 쓰레드 방식의 GC를 수행합니다.

    CMS GC는 stop the world 시간을 줄이기 위해 고안되었습니다.

    reachable한 객체들을 한번에 찾지 않고 순차적으로 찾는 것이 특징입니다. GC를 처리하는 쓰레드는 하나지만, 나머지 쓰레드들은 작업을 멈춥니다.

    G1 GCCMS GC의 메모리 단편화를 개선한 알고리즘입니다.

    Heap 영역을 Region으로 나누었습니다. Garbage만 있는 리전을 먼저 수거하기 때문에 Garbage First라는 이름이 붙여졌습니다.

     


     

    728x90

    댓글