ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GC(Garbage Collection) 컬렉션 과 Heap 영역
    JAVA공부/JVM 2022. 1. 6. 00:22

    Garbage Collection 이란

         자바에서는 새로 생성 되는 객체에 대한 메모리들이 Heap영역에 저장된다.

         초기 C언어 같은 경우는 이런 참조 변수들에 대한 메모리 관리가 중요했다. 더이상 쓰지 않는 변수들에 대한

         메모리 할당을 없애주어야 하는 것이다. 이를 해주지 않는다면, 프로그램에 규정된 메모리가 full되어 누수가 되거나

         멈추게 되는 것이다.

         그러나 자바에서는 GC라는 장치가 있어, 우리가 더이상 참조하지 않는 객체에 대해서 제거를 해주게 된다.

       

    JC 가 다루는 Object

     

         위 사진과 같이 unreachable (힙 영역 내에서 자신들끼리 참조하는 객체들)이 GC 대상이 된다.

         이 때,  GC에서 공통적으로 수행되는 단계를

                 1. Stop-The-World

                 2. Mark And Sweep

         이라고 한다.

    Stop-The-World 이란

        GC 에서 중요한 개념으로 , GC가 일어날 때 GC를 제외한 모든 쓰레드가 일시적 정지를 하게 되는 걸 의미한다.

        따라서 GC가 너무 자주 일어나지 않게 개발자가 메모리관리를 어느정도 해주고 STOP-THE WORLD시간을 줄이는

        것이 중요하다.

     

    Mark And Sweep 이란

        Mark : 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업이다.

        Sweep : Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업이다.

        

    - Stop The world를 통해 모든 작업을 중단 GC는 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각이 어떤

       객체를 참고하고 있는지를 탐색하게 된다. 그 후 사용되고 있는 메모리를 식별하는데, 이런 과정을 Mark라 하고

       Mark가 되지 않는 객체들을 메모리에서 제거 하는데 , 이런 과정을 Sweep이라고 한다.

     

    Heap영역

    weak generational hypothesis이란 가설을 이용해서  

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

    2. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.

     

    HotSpot VM에서는 공간을 둘로 나누었는데 ,Young 영역과 Old영역이다.

     

    Young 영역에서는 새로운 객체가 생성되는데 , EDEN에서 생성된 객체가 들어가고, 계속 객체가 생성되다가 EDEN이

    FULL이 되면, 더이상 참조되지 않는 객체는 사라지고 (Minor GC) 계속 참조되면 survivor1 OR surivivor2 - >Old영역으

    넘어가게 된다.  survivor영역에서 살아남은 객체는 다른 survivor영역으로 가기 때문에 둘중 하나는 비어있게 된다.

     

    Old 영역에서는 모든 객체를 검사하는 Major GC를 실행한다. 영역 크기가 크기때문에 자주 일어 나진 않지만

    검사하는 범위가 크기 때문에 Stop The World를 조심해야 한다.

     

     

     

    GC 알고리즘


    Serial GC

    Serial GC의 Young 영역은 Mark Sweep대로 수행 되고, Old영역은 Mark Sweep Compact 이 실행된다.

    Mark Sweep은 동일하고 Compact는 살아있는 객체들을 가장 앞쪽으로 모아주는 일이다.

    Serial GC는 서버의 CPU 코어가 1개 즉 , 자원이 많이 없을 때 사용하는 알고리즘  이다. 모든 가비지 컬렉션을 처리하기 위해 1개의 쓰레듬만을 사용한다. 따라서 멀티코어 서버에서는 Serial GC 사용을 피한다.

     

     

    Parallel GC

    Parallel GC는 Throughput GC로도 알려져 있으며, 기본 처리 과정은 Serial GC와 동일하나, 여러개의 쓰레드를 통해GC를 수행한다. (GC의 오버헤드를 줄여준다), 이 알고리즘은 멀티 프로세서 또는 멀티 쓰레드 머신에서 중간~대규모 데이터를 처리하는 애플리케이션을 위해 고안되었다. 옵션을 통해 애플리케이션의 최대 지연시간 또는GC를 수행할 쓰레드의 갯수를 설정해줄수 있다.

     

    CMS(Concurrent Mark Sweep) GC

    CMS GC는 Parallel GC와 마찬가지로 여러개의 쓰레드를 이용한다. 하지만 기존의 Serial GC 나 Parallel GC와는

    다르게 Mark Sweep 알고리즘을 Concurrent하게 수행한다.

     

    그러나 CMS GC는 다른 GC방식보다 메모리와 CPU를 더 많이 필요하며, Compaction단계를 수행하지 않는다.

    장기적 운영을 거쳐 Compaction단계를 수행하면 조각난 메모리들이 많아서 Stop The World 시간이 길어지게 된다.

     

     

     

    G1(Garbage First) GC

    G1 GC 는 장기적 문제가 많은 CMS GC를 대체하기 위해 개발되었다.

    G1 GC는 Eden영역에 Heap영역을 할당하고, Survivor로 카피 하는 과정을 사용하지만 물리적으로 메모리공간을

    나누지 않는다. 대신 Region(지역)이라는 개념을 도입하여, Heap 을 균등하게 여러개의 지역으로 나누고, 각 지역을

    역할과 함께, 논리적으로 구분하여 (Eden 지역인지, Survivor 지역인지, Old 지역인지) 객체를 할당한다.

    G1 GC 는 Eden, Survivor, Old, Humongous , Available/Unused 역할이 있다.

    humonogous는 Region 크기의 50%를 초과하는 객체를 저장하는 Region을 의미하며, Available,Usused는 사용되지

    않는 Region을 의미한다.

    G1 GC 는 Heap 을 동일한 크기의 Region으로 나누고, Garbage가 많은 지역에 대해 우선적으로 GC를 수행한다.

    G1 GC 의 Minor GC, Major GC는 일반적인 GC와 비슷하다.

     

    Minor GC

     

    한 지역에 객체를 할당하다가 해당지역이 꽉 차면 다른 지역에 객체를 할당하고, Minor GC수행한다.

    G1 Gc는 각지역을 추적하고 있기 때문에, Garbage가 가장 많은 지역을 우선으로 Mark and Sweep을 수행한다.

    Eden 지역에서 GC 가 수행되면 살아남은 객체를 (Mark)하고, 메모리를 회수(Sweep)한다. 그리고 살아남은 객체를

    다른 지역으로 이동시키게 되는데 , 복제되는 지역이 Available/Unused이면 해당 지역은 Survivor영역이 되고

    Eden 영역은 Available/Unused 지역이 된다.

     

    Major GC

     

    시스템이 운영되다가 객체가 너무 많아 빠르게 메모리를 회수 할 수 없을 때 Major GC(Full GC)가 실행된다. 그리고 

    여기서 G1 GC와 다른 GC들의 차이가 두각을 보인다.

    기존의 다른 GC알고리즘은 Major GC가 모든 Heap영역에서 GC가 수행되었으며, 그에 따라 처리시간이 오래걸렸다.

    하지만 G1 GC는 어느 영역에 가비지가 많은지를 알고 있기 때문에 GC를 수행할 지역을 조합하여 해당 지역에

    대해서만 GC를 수행한다. 이 작업은 Concurrent 하게 수행되기 때문에 애플리케이션의 지연도 최소화 한다.

     

    하지만 G1 GC는 다른 GC에 비해서 잦게 호출 된다. 그러나 작은 규모의 메모리 정리 작업이고, Concurrent하게 수행

    되기 때문에 지연이 크지 않다. 

    이처리 방식은 어떤  GC방식보다 빠르며 큰메모리 공간에서 멀티프로세스 기반으로 운영되는 애플리케이션에 쓰인다.

     

     

    'JAVA공부 > JVM' 카테고리의 다른 글

    자바 Heap Dump  (0) 2022.11.04
    GC 튜닝  (0) 2022.01.14
    Garbage Collection 모니터링  (0) 2022.01.12
    JVM 기초 원리  (0) 2021.12.31
    JDK, JRE  (0) 2021.12.30
Designed by Tistory.