프로그램에서 더 이상 사용되지 않는 객체가 차지하고 있는 메모리를 자동으로 회수하여, 메모리 누수를 방지하고 프로그램 실행 중 메모리 부족 문제를 줄이는 자동 메모리 관리 형태.
힙(heap)에 할당된 객체들을 추적하고 어떤 객체들이 더 이상 사용되지 않는지를 판단
다음과 같은 과정을 통해 가비지 컬렉터가 메모리를 관리한다:
객체 추적 및 접근 가능성 분석: 모든 객체에 대한 참조를 추적하고, 루트 집합(root set)에서 접근 가능한 객체를 파악한다. 루트 집합은 스택, 글로벌 변수, 레지스터 등에서 참조되는 객체들로 구성
접근 불가능한 객체 식별: 프로그램에서 더 이상 접근할 수 없는 객체들을 식별. 이 객체들은 메모리에서 해제될 수 있다.
메모리 회수: 접근할 수 없는 객체가 사용하고 있던 메모리를 회수하고, 필요에 따라 메모리 조각 모음(Compaction)을 수행하여 메모리 사용을 최적화
프로그램이 동적으로 할당 했던 메모리 영역(HEAP) 중 필요 없게 된 영역을 알아서 해제
➕메모리 누수 방지
➕해제된 메모리 접근 방지
➕해제한 메모리 다시 해제 방지
➖GC 작업은 순수 오버헤드
➖개발자는 언제 GC가 메모리를 해제하는지 모름
실시간성이 강조되는 프로그램은 GC 메모리관리를 권장하지 않음
1. Reference Counting
힙 영역에 선언된 객체들이 각각 레퍼런스 카운트 라는 별도 숫자를 가지고 있음
레퍼런스 카운트가 0이 되면 GC 대상
➖순환 참조 문제: 서로 참조하는 객체들은 적용이 어려워 메모리 누수 발생
2. Mark and Sweep
루트에서 해당 객체에 접근 불가능할때 삭제
➖의도적으로 GC 실행시켜야
➖어플리케이션과 GC 실행 병행
객체는 대부분 일회성되며, 메모리에 오랫동안 남아있는 경우는 드물다
객체의 생존기간에 따라 Heap영역을 Young, Old 영역으로 나뉨
Young Generation
Old Generation
1. Stop the world
2. Mark and sweep