반응형

가비지 컬렉션(Garbage Collection, GC)


메모리 관리 기법 중 하나로 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능이다. 
즉, 동적 할당된 메모리 영역 가운데 어떤 변수도 가리키지 않는 메모리 영역을 탐지하여 자동으로 해제하는 기법이다. 




장점 


GC를 이용하게 되면 프로그래머가 동적으로 할당한 메모리 영역 전체를 완벽하게 관리하지 않아도 된다. 즉, GC를 통해 아래와 같은 버그를 줄이거나 막을 수 있다. 


유효하지 않은 포인터 접근 : 이미 동적 할당한 메모리를 해제한 영역에 접근하게 되는 버그 
이중 해제 : 이미 해제된 메모리를 또 다시 해제하는 오류를 줄일 수 있다. 대표적으로 C에서는 free()를 통해 해제하고 또 다시 free()를 하면 정상 종료 되지 않는다. 


메모리 누수 : 더이상 사용하지 않는 메모리 영역을 해제하지 않고 남겨진 것이 쌓이게 되면 메모리 누수가 일어난다는 것이다. 이러한 메모리 누수가 지속되면 메모리 고갈로 인해 프로그램이 중단 될 수 있다. 

단점 


어떤 메모리를 해제해야 할 지 결정하는데 사용되는 알고리즘에 의해 비용이 든다. 객체가 필요없어지는 시점을 프로그래머가 알고 있는 경우에도 GC 알고리즘이 메모리 해제 시점을 추적해야하기에 비용이 들게된다. 


GC가 행동하는 타이밍이나 GC의 점유 시간을 사전에 예측하기 어렵기에 실시간 시스템에는 적합하지 않다. 
할당된 메모리가 해제되는 시점을 알 수 없게 된다. 



가비지 컬렉션의 위험성


실시간 시스템에서 Garbage Collection이 사용된다면 치명적인 오류를 발생할 수 있다. 군사목적의 프로그래밍(미사일 발사 등) 혹은 비행시스템 등에서 실시간으로 목표물 지점으로 날아가고 있는 중간에 Garbage Collection이 발생하여 동작하게 되면 잠시 동안 앞에서 말한 알고리즘의 동작이 멈출 수 있는 가능성 때문에 실시간 시스템에서는 Garbage Collection은 지양해야 한다. 




방식 


포인터 추적 방식 

포인터 추적 방식은 한 개 이상의 변수가 접근 가능한 메모리는 사용하고있는 메모리라 간주하고, 그 밖의 메모리를 해제하는 방식이다. 

이때 접근 가능한 메모리의 의미는 어떤 변수가 가리키는 직/간접적인 메모리를 의미하고 재귀적으로 접근하여 모든 접근 가능한 메모리를 파악 할 수 있다. 
변수가 가리키는 객체 즉, 지역 변수와 전역 변수 모두를 포함한다. 
접근 가능한 객체가 가리키는 모든 객체는 마찬가지로 접근 가능하다. 



Mark and sweep 

 

https://blog.sessionstack.com/how-javascript-works-memory-management-how-to-handle-4-common-memory-leaks-3f28b94cfbec?gi=fd24d3e9065e 
Mark and sweep 기법은 포인터 추적 방식 중 가장 단순한 기법으로 할당받은 메모리중 1비트를 남겨 메모리를 사용하는지 하지 않는지 표시 여부로 쓴다. 
이제 표시 단계에서 모든 변수가 가리키는 메모리(객체)를 사용중이라 표시하고 재귀적으로 끝까지 따라가며 모든 직/간접적인 사용중인 메모리에 마킹을 한다. 
그 후 마킹이 안된 영역에 대해서는 모두 메모리 해제를 진행하면 사용중이지 않은 메모리의 할당 해제를 할 수 있다. 
하지만 이 기법의 치명적인 단점은, 표시 단계에서 메모리 내용이 변경되면 되지 않기 때문에 전체 시스템 실행이 정지된다는 단점이 있다. 



삼색 표시 기법 


위의 Mark and sweep의 단점을 극복하기 위해 삼색 표시 기법이라는 것을 이용 할 수 있다. 
Mark and sweep과 같은 방식으로 동작되지만 표시 단계에서 0/1이 아닌 흰색, 회색, 검은색이라는 정보 중 하나로 메모리에 표시를 한다. 방법 및 추가 내용은 아래 링크를 참조하자.(위키에 아주 자세히 설명되어있다.) 
https://ko.wikipedia.org/wiki/%EC%93%B0%EB%A0%88%EA%B8%B0_%EC%88%98%EC%A7%91_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99) 

반응형