unreachable object를 Heap에서 비워주는 작업을 하는것이 GC인데 어떻게 작동하는지, 어떤 알고리즘을 이용해서 unreachable을 판단하는지 알아보자.
일반적으로 언어 런타임은 힙이 소진 되고 mutator thread의 메모리 할당 요청을 충족하는 데 사용할 수 있는 메모리가 더 이상 없음을 발견하면 GC를 트리거한다.
def memory_allocator(n):
# Allocate and return 'n' bytes on the heap.
ref = allocate(n)
if not ref:
# Oops. We are out of memory. Invoke GC.
gc()
# Retry allocation
ref = allocate(n)
if not ref:
# Let's give caller a chance to do something about it.
# i.e. delete references, purge caches etc.
raise OutOfMemory
return ref
//참조: https://www.educative.io/courses/a-quick-primer-on-garbage-collection-algorithms/jy6v
Reference Counting은 어떤 한 동적 단위(객체, Object)가 참조 카운터 필드를 가지고 이 단위 객체가 참조(참조 복사)되면 참조 카운터를 늘리고 참조한 다음 더이상 사용하지 않게 되면 참조 카운터를 줄이면 된다. 보통 참조 카운터가 0이 되면 더이상 유효한 단위 객체로 보지 않아 메모리에서 제거한다.
struct object
{
int ref;
};
struct object* object_new(void)
{
struct object* p=malloc(sizeof(struct object));
p->ref=1;
return p;
}
int object_ref(struct object* p)
{
return (p->ref++);
}
int object_unref(struct object* p)
{
if ((p->ref--)!=0)
return p->ref;
else
{
free(p);
return 0;
}
}
다음 코드와 같이 참조가 늘어날때마다 참조 카운터를 증가 시키고 참조 필요 없게되면 해제 해야한다.
https://en.wikipedia.org/wiki/Reference_counting
https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)#Reference_counting
https://www.geeksforgeeks.org/types-references-java/
https://www.educative.io/courses/a-quick-primer-on-garbage-collection-algorithms/jR8ml
모든 가비지 수집 알고리즘은 2가지 기본 작업을 수행해야 합니다. 첫째, 도달할 수 없는 모든 개체를 감지할 수 있어야 하고 둘째, 가비지 개체가 사용하는 힙 공간을 회수하고 해당 공간을 프로그램에서 다시 사용할 수 있도록 해야 합니다. 위의 작업은 다음과 같이 나열되고 추가로 설명된 대로 Mark 및 Sweep 알고리즘에 의해 두 단계로 수행됩니다.
Mark
객체가 생성될 때 해당 마크 비트는 0(거짓)으로 설정된다. Mark 단계에서 도달 가능한 모든 객체(또는 사용자가 참조할 수 있는 객체)에 대해 표시된 비트를 1(true)로 설정한다. 이제 이 작업을 수행하려면 그래프 순회만 수행하면 되며 깊이 우선 검색 접근 방식을 이용한다. 여기에서 우리는 모든 객체를 노드로 간주할 수 있으며 이 노드(객체)에서 도달할 수 있는 모든 노드(객체)를 방문하고 도달 가능한 모든 노드를 방문할 때까지 계속한다.
Sweep
개체를 "소거"한다. 즉, 연결할 수 없는 모든 개체의 힙 메모리를 지운다. 표시된 값이 false로 설정된 모객체는 힙 메모리에서 지워지고 다른 모든 객체(도달 가능한 객체)에 대해서는 표시된 비트가 true로 설정된다.
예시
1. 모든개체는 False로 되어있다.
2. 도달가능한 개체는 true로 변환
3. 도달할 수 없는 개체는 힙에서 지움(sweep)
https://www.geeksforgeeks.org/mark-and-sweep-garbage-collection-algorithm/
https://joel-dev.site/94