Closed siner308 closed 2 years ago
추가해야할 부분
https://en.wikipedia.org/wiki/Garbage_(computer_science) https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)#Principles https://parksuseong.blogspot.com/2019/12/cassandra-stress-test-garbage-collector.html https://knight76.tistory.com/entry/cassandra-compaction-%EA%B4%80%EB%A0%A8
title: "가비지컬렉션(Garbage Collection)의 종류와 특징" subtitle: "동적 언어의 메모리 관리 기법" tags:
computer science date: 2021-12-26
가비지컬렉션 (garbage collection, GC)은 자동으로 메모리를 관리해주는 기법이다. 프로세스에 의해 할당되었지만, 더이상 참조되지 않는 메모리를 garbage라고 하고, 이러한 garbage를 수거하는 작업은 garbage collector가 진행한다.
java, python 등의 언어들은 이러한 GC를 염두에 두고 설계되어, 언어 자체에 해당 기능이 포함되어 있다.
C, C++ 등의 수동 메모리 관리를 가정하고 설계된 언어의 경우에도 GC를 지원하는 구현도 존재한다.
1. Tracing
tracing은 가장 대표적인 GC 기법이다. tracing 알고리즘의 기본 개념은 root object로부터 접근 가능한 객체인지 추적한다는 것이다. 이러한 reference chaining 과정에서 탐지되지 않은 객체는 접근 불가능한 것이고, 따라서 GC의 대상이 된다.
기본 알고리즘 1-1. mark-and-sweep
이름 그대로 mark하고 sweep하는 알고리즘이다. mark-and-sweep 알고리즘에서, 각각의 객체는 1비트의 flag를 하나씩 갖는다.
mark 단계에서는 root set 전체를 순회하며 flag를 '사용중' 상태로 설정한다. sweep 단계에서는 메모리가 모두 스캔되었기에 '사용중' 상태가 아닌 메모리를 모두 free로 바꿀 수 있다.
이 기법은 단점이 몇가지 있는데, 그중 하나는 GC를 진행하는 동안 전체 시스템을 freeze 시켜야 한다는 점이다.
기본 알고리즘 1-2. Tri-color marking
mark-and-sweep의 퍼포먼스 문제로 인해, 현대의 tracing GC는 tri-color marking 의 추상적 모델을 기반으로 다양하게 발전하고 있다.
tri-color marking은 아래와 같이 동작한다.
이 알고리즘은 mark-and-sweep 알고리즘과는 달리, 상당한 시간동안 시스템의 중단 없이 즉시(on-the-fly) 수행이 가능하다.
다양한 구현 전략
2. Reference counting
레퍼런스 카운팅 방식의 GC에서 각 객체는 참조당하는 횟수를 표시해둔다. 이때 참조 횟수가 0이라면 Garbage라고 할 수 있다. 참고가 생기면 count는 증가하고, 참조가 사라지면 감소한다. count가 0이 되었을때, 객체를 해제한다.
update 비효율을 다루는 방법
작성 예정
순환참조를 다루는 방법
작성 예정
구현 방법
2-1. Weighted reference counting
2-2. Indirect reference counting
장점
단점
3. Escape analysis
이스케이프 분석은 컴파일 타임에 heap allocation을 stack allocation으로 변환하는 방법이다. 이렇게 함으로써 GC의 수집 양을 줄일 수 있다.
references