본문 바로가기

프로그래밍/IT

가비지컬렉션

가비지 컬렉션은 기존에 할당된 메모리를 재사용하는 매커니즘으로, 나중에 메모리를 할당할 때 재사용할 수 있다, 대부분의 프로그래밍 언어는 가비지 컬렉션을 자동으로 실행한다. 가비지 컬렉션을 사용하면 메모리를 직접 해제할 필요가 없다. 자바에서는 new 키워드로 새로운 객체를 생성한다면 JVM은 해당 객체에 저장된 데이터에 적절한 양의 메모리를 할당한다, 객체가 더 이상 필요하지 않으면 JVM 공간을 재배치해야 한다. 그래서 생성된 다른 객체가 해당 메모리 공간을 사용하게 된다.
C와 C++ 같은 프로그래밍 언어에서는 malloc와 free 함수를 호출해서 이런 메모리 할당을 수동으로 직접 관리해야 했다. 자바와 C# 같은 대부분의 모던 프로그래밍 언어에는 효율을 높이기 위해 메모리를 자동으로 관리하는 시스템이 있다. 덕분에 프로그래머는 잠재적으로 발생할 수 있는 모든 실수를 줄일 수 있다.
가비지 컬렉션 알고리즘은 몇 가지가 있다. 모든 작동 중인 코드에서 더 이상 참조하지 않는 메모리를 찾은 후 메모리를 할당할 때 이용할 수 있도록 반환한다는 공통의 목적이 있다. 그러므로 자바의 전통적인 가비지 컬렉션은 mark-and-sweep 방식이라고 한다. 실행 준인 코드에서 참조하는 객체는 live로 표시되며 해당 객체에서 참조하는 것들 역시 확인해서 live로 표시한다. 이는 현재 동작하는 객체의 모든 경로가 확인될 때까지 계속된다.
이 과정이 끝나면 힙에 있는 각 객체들을 찾아다니며 live로 표시되지 않은 메모리 위치에 메모리를 할당할 수 있게 만든다. 그리고 이 과정이 진행되는 동안에는 메모리를 할당할 수 있게 만든다. 그리고 이 과정이 진행되는 동안에는 메모리를 재배치하려고 JVM의 모든 스레드가 정지되는데, 이를 stop-the-world라고 한다, 자연적으로 가비지 컬렉터는 이 작업에 소요되는 시간을 최소화하려고 노력한다.
자바가 처음 출시도니 이후로 가비지 컬렉션 알고리즘은 가능한 한 많은 작업을 병렬로 수행할 수 있게 몇 번의 변화를 거듭했다. 자바 6에는 garbage First라는 새로운 알고리즘이 도입되었다. 이는 자바 6에서 테스트하면서 효율성이 증명되었고, 자바 7에서는 실무에 본격 도입되었다. G1 알고리즘은 여전히 병렬로 실행 중인 mark-and-sweep에 집중한다. 그러나 빈 메모리 영역을 우선시해 가능한 많은 공간을 비우두려고 한다.
결국 가비지 컬렉션은 다른 제너레이션으로의 이동 가능한 한 많은 여유 공간을 남겨두려는 목적으로 메모리에서 객체들을 옮기고 자주 접근되는 객체들을 묶어두는 등의 다른 연산을 수행한다. 이것을 컴패션이라고 한다, 컴패션은 live로 표시한 객체들을 다른 물리적인 메모리 위치로 옮김으로써 JVM이 stop-the-world인 동안 메모리 공간을 확보한다.

'프로그래밍 > IT' 카테고리의 다른 글

Git 정리  (0) 2022.11.13
데이터베이스 요약  (0) 2021.04.19
JAVA 프로그래밍 요약  (0) 2021.04.19
MVC 패턴  (0) 2020.04.29
Black-box vs. White-Box  (0) 2020.04.28