열심히 끝까지

[10분 테코톡] 던의 JVM의 Garbage Collector 영상정리 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(과제)

[10분 테코톡] 던의 JVM의 Garbage Collector 영상정리

노유림 2022. 6. 12. 01:18

JVM의 Garbage Collector(동영상시청)
영상 : https://www.youtube.com/watch?v=vZRmCbl871I

JVM(Java Virtual Machine)
   : 운영체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램
   : 역할 - 메모리 관리 Garbage Collector 수행

Garbage Collector
   : Garbage Collector was invented to simplify-manual memory management.
    ( 가비지 컬렉터는 메모리를 간단하게 관리하기 위해서 발명되었다.)
   : 동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능
     - 이때, 동적으로 할당한 메모리 영역 = "heap"

   - Stack
      : 정적으로 할당한 메모리 영역
      : 원시 타입의 데이터가 값과 함께 할당
      : Heap영역에 생성된 Object 타입의 데이터의 참조 값 할당

   - Heap
      : 동적으로 할당한 메모리 영역
      : 모든 Object 타입의 데이터가 할당(Object 최상위 클래스를 상속받은 데이터) 
      : Heap영역의 Object를 가리키는 참조변수가 Stack영역에 저장

    ex ) 
     public class main{
          public static void main(String[] args){
               int num1 = 10;
               int num2 = 5;
               int sum = num1 + num2;
               String name = "던";
           
               System.out.println(sum);
               System.out.println(name);
          }
     }
      1. Stack : num1=10
          Heap : 
      2. Stack : num1=10 | num2=5
          Heap : 
      3. Stack : num1=10 | num2=5 | sum=15
          Heap : 
      4. Stack : num1=10 | num2=5 | sum=15 | name
          Heap : String 던(참조하는 변수 name은 스택에 저장)
      - 메인 메서드가 끝나면...
      5. Stack : (모두 pop up)
          Heap : String 던(=Unreachable Object) 
                     ㄴ> Garbage Collector 대상

Garbage Collector 과정
   1. Garbage Collector가 Stack의 모든 변수를 스캔하면서 
      각각 어떤 객체를 참조하고 있는지 찾아서 마킹
   2. Reachable Object가 참조하고 있는 객체를 찾아서 마킹
   3. 마킹되지 않은 객체를 Heap에서 제거
      >> 이때 1, 2 과정이 객체를 찾아서 마킹하는 과정 = "Mark"
      >> 3 과정이 객체를 제거하는 과정(쓸어내린다) = "Sweep"
    >> Garbage Collector 과정은 Mark and Sweep 과정이라고도 함

   ex ) Stack                       Heap

         names --------- List -- 0   -  String 미스터 코
                                      ㄴ1    -  String 큰곰
                                      ㄴ2    -  String 뚱이
                                                  String 던

       names에 list0, 1, 2가 참조하는 것 외인 String 던 이라는 객체는 
       Unreachable Object가 되어 Garbage Collector를 통해 해제

Garbage Collection은 언제 일어날까?
   - Heap의 구조부터 알아보자!
     : Heap은 New Generation Old Generation 이라는 영역으로 구분
     : New Generation은 최신에 만들어진 객체가 저장되는 곳
         - Eden, Survival 0, Survival 1이라는 영역으로 구분
         - Survival 0 혹은 Survival 1 이 둘 중 하나는 꼭 비어있게 된다.
           (동시에 같이 차 있는 경우는 없다)
           : Eden영역에 새로운 객체 할당
                  - Eden영역이 다 할당되면 GC(Garbage Collector) 발생
                        >> "Minor GC" 라고 함
                  - Eden영역의 Reachable 객체는 Survival 0로 이동
                  - Eden영역의 Unreachable 객체는 GC로 메모리에서 해제
           : Survival 0에는 Eden영역의 Reachable 객체들이 이동하는 곳
                  - Eden영역이 다 할당되고, 아직까지 연결되어 있는 객체가 오는 곳
                  - Eden영역이 계속해서 반복하여 Survival 0영역도 다 할당되면
                    Survival 0에 Mark and Sweep 과정(GC) 발생
           : Survival 1에는 Survival 0영역의 Reachable 객체들이 이동되는 곳
             + Survival 1으로 Reachable 객체 이동 이후에 Eden의 Reachable 객체가
                Survival 0가 아닌 Survival 1으로 이동
                  - Survival 0영역에 있던 객체는 Survival 1 영역으로 이동하면서
                     이동한 객체의 Age 값은 증가
                  - 이때, 다음 Eden의 GC가 발생했을 때 나오는 Reachable 객체는 
                    Survival 0가 아닌 Survival 1으로 이동
                  - Survival 0에서 넘어온 객체와 Eden에서 넘어온 객체의 age값은 다름
                  - Survival 1영역이 다 할당되면 Survival 1영역에 있던 Reachable 객체들은
                    Survival 0영역으로 이동 + 이동한 객체는 Age값 증가
           : 이 과정을 계속 반복하다가 어떤 객체가 특정 Age값을 넘어서면 
             Old Generation영역으로 이동 = "Promotion"이라고 함
           : 이 과정이 또 계속 반복되면 Old Generation영역이 다 할당되면 GC 발생
                >> 이 때 발생하는 GC = "Major GC"
   >> 지금까지의 과정이 반복되면서 Garbage Collector가 수행 및 메모리를 관리
            
Garbage Collector 종류
   1. Serial GC
      : GC를 처리하는 스레드가 1개 존재
      : CPU 코어가 1개만 있을 때 사용하는 방식
      : Mark-Compact Collection 알고리즘 사용  
              - Mark and Sweep 과정에 Compact가 추가된 과정
              - 데이터를 해제하고 나면 남아있는 부분이 있는데
                 이 데이터를 모두 한 곳에 몰아서 메모리 공간을 정리해주는 기능을 함

   2. Parallel GC
      : GC를 처리하는 스레드가 여러 개 존재
      : Serial GC보다 빠르게 객체를 처리할 수 있음
      : Parallel GC는 메모리가 충분하고 코어의 개수가 많을 때 사용하면 좋음

   3. Concurrent Mark Sweep GC(CMS GC)
      - Stop-The-World?
          : GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
          : Stop-The-World가 발생하면 GC를 실행하는 스레드를 제외한
            나머지 스레드는 모두 작업을 멈춤
          : GC 작업을 완료한 이후에 중단한 작업을 다시 시작
          : 앞에서 설명한 Serial GC와 Parallel GC도 Stop-The-World를 진행
              - GC 발생할 때는 애플리케이션 실행을 멈추고 GC 진행
      : 속도가 중요한 애플리케이션에서 Stop-The-World의 영역을 줄임으로서
        효율적으로 동작하는 GC
      : 위에서 말한 Garbage Collector 과정에서 1번 과정을 Initial Mark에서 수행
        > Stack의 변수를 스캔하면서 어떤 객체를 참조하는지 마킹한 후 
           Concurrent Mark에서 다른 애플리케이션과 동시에 수행하면서 
           Initial Mark에서 마킹해놓은 객체가 어떤 객체를 참조하고 있는지 
           객체그래프를 타고 가면서 마킹하는 과정
      : Remark는 애플리케이션과 동시에 수행되다 보니 
        애플리케이션 스레드가 실행되면서 새로운 객체가 생성되거나 메모리에 생긴 변화를
        Remark에서 재검토하면서 마킹을 제대로 실행
      : 위 과정을 거친 후 Concurrent Sweep와 애플리케이션 스레드가 동시에 실행
         >> 데이터 해제

   - Concurrent Mark Sweep GC(CMS GC)의 장점
      : Stop-The-World의 시간이 짧음
      : 애플리케이션의 응답시간이 빨라야 할 때 CMS GC를 사용

   - Concurrent Mark Sweep GC(CMS GC)의 단점
      : 다른 GC 방식보다 메모리와 CPU를 더 많이 사용(그만큼 과정이 좀 더 김)
      : Compaction(압축) 단계가 제공되지 않음

   4. G1 GC
      : 각 영역(Eden, Survival, Old Generation)을 Region 영역으로 나눔
      : GC가 일어날 때, 전체 영역(Eden, Survival, Old Generation)을 탐색하지 않음
      : G1 GC는 바둑판의 각 영역에 객체를 할당하고, GC 실행
      : 그러다가, 해당 영역이 꽉 차면 다른 빈 영역에, 객체를 할당하고 GC 실행
      : G1 GC는 STW(Stop-The-World)시간이 짧음
      : Compaction을 사용