ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [매일읽기] Garbage Collection: How it’s done
    개발자 라이프/매일읽기 2020. 8. 16. 10:41
    반응형

    원문 : https://medium.com/@kasunpdh/garbage-collection-how-its-done-d48135c7fe77

     

    Garbage Collection: How it’s done?

    If you are familiar with the basics of the memory allocation in programming languages, you know that there are two parts in the memory…

    medium.com

    Heap과 Stack 메모리

    • Stack 메모리는 스레드 실행에 사용되는 메모리
      • 함수가 호출되면 스택에 메모리 블록이 할당되고, 그 메모리 함수의 지역 변수들이 저장됨
      • 함수가 반환되면 할당됐던 메모리들도 해제됨
    • Heap 메모리는 new 등의 키워드를 통한 동적 할당에 사용됨
      • 사용하지 않는 메모리를 해제하는 작업은 별도로 진행됨
        • C/C++ 같은 경우 개발자가 직접 관리하는데, 잘못 관리할 경우 메모리 누수 혹은 NPE가 발생
        • Java/C# 같은 경우 가비지 컬랙터가 자동적으로 메모리를 관리함
          • 가비지 컬랙터는 객체에 대한 메모리를 할당하고, 사용할 수 있고, 더 이상 사용되지 않는 객체를 찾아 메모리에서 해제한다. 또한 현재 사용하고 있는 객체는 해제하지 않아 NPE가 발생하지 않도록 한다.

    가비지 컬랙터에서의 레퍼런스 카운트

    • 메모리 상의 객체가 몇 개의 참조를 받는지 즉, 몇 개의 변수가 해당 객체를 할당받아 사용하고 있는지 그 수를 센다. = 레퍼런스 카운트
    • 레퍼런스 카운트가 0 이되면 더 이상 사용하지 않는다고 판단하여 메모리를 해제한다.
    • 레퍼런스 카운트는 실제로 사용하고 있지 않지만 서로 순환 참조하고 있는 객체들에 대해서는 탐지할 수 없는 단점이 있다.

    Mark & Sweep GC

    • 가비지 컬랙션은 마크와 스윕 과정을 통해 진행된다.
    • 마크 :
      • 가비지 컬랙터가 여전히 참조되고 있는 객체에 대하여 마킹한다. 
      • 마킹은 mark 비트를 true로 바꾸는 작업
      • 마킹 작업은 루트 셋(root set, 스택 메모리 상의 지역 변수 혹은 전역 변수의 묶음)가 참조하고 있는 객체로부터 시작한다.
      • 루트 셋을 시작으로 참조되지 않는 객체들을 해제되기 때문에 순환 참조하고 있는 객체들도 해제된다. 
        • 순환 참조는 변수의 참조를 받고 있는 것이 아니므로 루트 셋에서 도달할 수 없다(unreachable).
      • 마킹 작업 중에는 참조 관계의 변화를 방지하기 위해 애플리케이션 스레드들이 모두 중단된다.

    출처 : https://app.pluralsight.com/library/courses/understanding-java-vm-memory-management/description

    • 스윕 : 
      • 마킹되지 않은 객체들 전부를 메모리 해제한다.
      • 살아남은 메모리들은 전체 메모리 사이사이에 존재하기 때문에 메모리 단편화가 발생할 수 있다.

    출처 : https://app.pluralsight.com/library/courses/understanding-java-vm-memory-management/description

    Mark-Sweep-Compact GC

    • 스윕 과정에서 발생하게 되는 메모리 단편화를 방지하기 위해 압축 단계를 추가
    • 기존 객체의 메모리를 복사해서 이동시키므로 추가적인 중단이 발생하게 된다.

    출처 : https://app.pluralsight.com/library/courses/understanding-java-vm-memory-management/description

    Mark & Copy GC

    • 기존 Mark & Sweep GC와 유사하지만 메모리 영역을 fromspace와 tosapce 2개로 나눠서 진행
    • 마킹 단계는 기존과 동일
    • 카피 단계는 마킹된 객체 메모리만 다른 영역(space)로 복사하는 단계
      • 복사된 뒤 이전 영역은 모두 메모리 해제된다.

    출처 : https://app.pluralsight.com/library/courses/understanding-java-vm-memory-management/description
    출처 : https://app.pluralsight.com/library/courses/understanding-java-vm-memory-management/description

    Generational GC

    • 제네레이셔널 GC는 메모리 영역을 영(young)과 올드(old) 세대로 나눈다.
    • 초기에 모든 객체 메모리는 영 세대(메모리 영역)에 할당
    • 영 세대에서의 GC 후 살아남은 객체 메모리들은 올드 세대로 승격(promote)된다.
    • 올드 세대 GC는 영 세대 GC 보다 덜 일어나게 되는데, 이는 "한 번의 GC 후 살아남은 객체는 오래 살아남는 경향이 있다"라는 접근으로 구성된 것이다.

    출처 : https://app.pluralsight.com/library/courses/understanding-java-vm-memory-management/description
    출처 : https://app.pluralsight.com/library/courses/understanding-java-vm-memory-management/description

     

    읽고 나서

    • 마크 과정에서 STW가 발생한다면 마이너 GC에서도 STW가 발생하는 거였구나! 풀 GC에서만 STW가 발생하는 줄 알았었다.
    • JVM GC는 위 여러 방식의 조합으로 이뤄진 거구나
    • Mark & Sweep GC -> Mark-Sweep-Compact GC -> Mark & Copy GC -> Generational GC라는 단계적인 순서로 메모리 관리 방식이 진화하는 모습을 같이 알 수 있어서 좋았다.
    반응형

    댓글

Designed by Tistory.