개발 관련 공부를 하다 보면, 종종 가비지 컬렉션이라는 단어를 접하게 된다.
문맥의 흐름상 프로그램에서 나온 잉여를 처리하는 무언가 정도로 해석하곤 했는데,
오늘은 그간 막연히 대해 왔던 가비지 컬렉션에 대해 알아보고자 한다.
내 주언어는 javascript이지만, 찾아보니 Java의 가비지 컬렉션에 대한 참고자료가 더 다양했다.
그래서 오늘은 Java 및 JVM의 가비지 컬렉션에 대한 내용 기반으로 포스팅을 작성했으니 읽을 때 참고하면 좋을 것 같다.
Automatic garbage collection is the process of looking at heap memory, identifying which objects are in use and which are not, and deleting the unused objects
오라클 공식 문서에 의하면, 가비지 컬렉션은 다음과 같이 정리할 수 있다.
여기서 사용 중인 객체란 참조값으로 연결된 객체 또는 프로그램에서 아직 포인터로 연결된 객체를 의미한다.
즉, 가비지 컬렉션은 힙 메모리를 확인하면서 프로그램에서 현재 사용 중인 참조 객체를 파악하고,
사용 중이지 않은 객체는 지워주는 역할을 하고 있다.
가비지 컬렉션은 2단계로 이루어지는데, 마킹과 삭제이다.
첫 번째 단계인 마킹에서 메모리를 사용 중인 영역에 대해 확인하고,
사용 하지 않는 객체가 확인되면 두 번째 단계에서 해당 부분을 삭제한다.
삭제에서 성능을 향상시킨 압축 삭제가 있고, 압축 삭제는 기존 삭제 방식 진행 후, 사용 중인 객체를 이동시켜 추후 메모리 할당의 성능을 향상시킨 방식이다.