-
[매일읽기] Garbage Collection: How it’s done개발자 라이프/매일읽기 2020. 8. 16. 10:41반응형
원문 : https://medium.com/@kasunpdh/garbage-collection-how-its-done-d48135c7fe77
Heap과 Stack 메모리
- Stack 메모리는 스레드 실행에 사용되는 메모리
- 함수가 호출되면 스택에 메모리 블록이 할당되고, 그 메모리 함수의 지역 변수들이 저장됨
- 함수가 반환되면 할당됐던 메모리들도 해제됨
- Heap 메모리는 new 등의 키워드를 통한 동적 할당에 사용됨
- 사용하지 않는 메모리를 해제하는 작업은 별도로 진행됨
- C/C++ 같은 경우 개발자가 직접 관리하는데, 잘못 관리할 경우 메모리 누수 혹은 NPE가 발생
- Java/C# 같은 경우 가비지 컬랙터가 자동적으로 메모리를 관리함
- 가비지 컬랙터는 객체에 대한 메모리를 할당하고, 사용할 수 있고, 더 이상 사용되지 않는 객체를 찾아 메모리에서 해제한다. 또한 현재 사용하고 있는 객체는 해제하지 않아 NPE가 발생하지 않도록 한다.
- 사용하지 않는 메모리를 해제하는 작업은 별도로 진행됨
가비지 컬랙터에서의 레퍼런스 카운트
- 메모리 상의 객체가 몇 개의 참조를 받는지 즉, 몇 개의 변수가 해당 객체를 할당받아 사용하고 있는지 그 수를 센다. = 레퍼런스 카운트
- 레퍼런스 카운트가 0 이되면 더 이상 사용하지 않는다고 판단하여 메모리를 해제한다.
- 레퍼런스 카운트는 실제로 사용하고 있지 않지만 서로 순환 참조하고 있는 객체들에 대해서는 탐지할 수 없는 단점이 있다.
Mark & Sweep GC
- 가비지 컬랙션은 마크와 스윕 과정을 통해 진행된다.
- 마크 :
- 가비지 컬랙터가 여전히 참조되고 있는 객체에 대하여 마킹한다.
- 마킹은 mark 비트를 true로 바꾸는 작업
- 마킹 작업은 루트 셋(root set, 스택 메모리 상의 지역 변수 혹은 전역 변수의 묶음)가 참조하고 있는 객체로부터 시작한다.
- 루트 셋을 시작으로 참조되지 않는 객체들을 해제되기 때문에 순환 참조하고 있는 객체들도 해제된다.
- 순환 참조는 변수의 참조를 받고 있는 것이 아니므로 루트 셋에서 도달할 수 없다(unreachable).
- 마킹 작업 중에는 참조 관계의 변화를 방지하기 위해 애플리케이션 스레드들이 모두 중단된다.
- 스윕 :
- 마킹되지 않은 객체들 전부를 메모리 해제한다.
- 살아남은 메모리들은 전체 메모리 사이사이에 존재하기 때문에 메모리 단편화가 발생할 수 있다.
Mark-Sweep-Compact GC
- 스윕 과정에서 발생하게 되는 메모리 단편화를 방지하기 위해 압축 단계를 추가
- 기존 객체의 메모리를 복사해서 이동시키므로 추가적인 중단이 발생하게 된다.
Mark & Copy GC
- 기존 Mark & Sweep GC와 유사하지만 메모리 영역을 fromspace와 tosapce 2개로 나눠서 진행
- 마킹 단계는 기존과 동일
- 카피 단계는 마킹된 객체 메모리만 다른 영역(space)로 복사하는 단계
- 복사된 뒤 이전 영역은 모두 메모리 해제된다.
Generational GC
- 제네레이셔널 GC는 메모리 영역을 영(young)과 올드(old) 세대로 나눈다.
- 초기에 모든 객체 메모리는 영 세대(메모리 영역)에 할당
- 영 세대에서의 GC 후 살아남은 객체 메모리들은 올드 세대로 승격(promote)된다.
- 올드 세대 GC는 영 세대 GC 보다 덜 일어나게 되는데, 이는 "한 번의 GC 후 살아남은 객체는 오래 살아남는 경향이 있다"라는 접근으로 구성된 것이다.
읽고 나서
- 마크 과정에서 STW가 발생한다면 마이너 GC에서도 STW가 발생하는 거였구나! 풀 GC에서만 STW가 발생하는 줄 알았었다.
- JVM GC는 위 여러 방식의 조합으로 이뤄진 거구나
- Mark & Sweep GC -> Mark-Sweep-Compact GC -> Mark & Copy GC -> Generational GC라는 단계적인 순서로 메모리 관리 방식이 진화하는 모습을 같이 알 수 있어서 좋았다.
반응형 - Stack 메모리는 스레드 실행에 사용되는 메모리