C언어를 공부하다 보면 개발자가 free() 등의 함수로 명시적으로 메모리에 접근을 해서 직접 메모리 할당 해제를 한다.
메모리 관리는 C뿐만 아니라, 다른 언어도 다 필요하지만 자바에서는 한 번도 메모리 관리를 해준 적이 없지만 잘된다. 바로 그 이유는 GC(Garbage Collector)
때문이다.
자바는 기본적으로 Automatic Memory Management 언어로 개발자가 메모리 관리를 해주지 않아도 자동으로 메모리를 관리해주는 언어
이며, 개발자가 메모리에 대한 제어 권한조차 없다.
1. GC 가비지 컬렉터는 뭐고 가비지는 또 뭐야?
자바에는 쓰레기가 존재한다. 바로 객체
이다.
String str = new String("쓰레기");
객체가 만들어지고 메모리를 점유하고, 더 이상 이 객체가 필요하지 않으면 메모리에서 해제되어야 한다.
사용하지 않는 객체의 메모리 점유는 결국 메모리 누수로 이어지게 된다.
메모리는 한정된 자원이기 때문에 사용하지 않거나 필요가 없는 부분은 해제를 해야 한다.
더 이상 객체가 필요하지 않은 순간 객체는 쓰레기가 된다.
자바에서는 이 쓰레기를 Garbage
라고하고 이 쓰레기를 치워주는 고마운 청소부가
존재하는데 바로 Garbage Collector
라고 줄여서 GC
라고 부른다.
C는 개발자가 직접 메모리를 관리해야 하는 반면 우리에겐 든든한 청소부가 있다.
가비지 컬렉션과 가비지 컬렉터의 차이점은?
- 가비지 컬렉터 : 메모리 해제를 위한 작업의 역할을 하는 주체
- 가비지 컬렉션 : 메모리 해제를 하는 작업을 의미
가비지 컬렉션은 프로세스 자체를 얘기하고 컬렉터는 실제 역할을 수행하는 주체를 얘기한다.
2. GC의 적용대상
자바에서 데이터를 처리하기 위한 영역에는 어떤 것들이 있는지 알아보자.
- PC 레지스터
- JVM 스택
- 힙(Heap)
- 메서드 영역
- 런타임 상수(Constant) 풀
- 네이티브 메서드 스택
이 영역 중에서 GC의 청소 대상이 되는 영역은 바로 힙(Heap)
영역이다. 힙을 제외한 나머지
영역들은 대상이 되지 않는다.
3. Stop the World
stop the world란, GC을 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
인데,
stop the world가 발생하면 GC를 실행하는 쓰레드
를 제외한 나머지 쓰레드는 모두 작업을 멈춘다.
GC 작업을 완료한 이후
에야 중단했던 작업을 다시 시작한다. 대개의 경우 GC 튜닝
이란 stop the world 시간
을 줄이는 것이다.
4. GC의 과정
크게 Young
영역과 Old
영역으로 나눌 수 있다.
다시 Young 영역에서 Eden
, Survivor_0
, Survivor_1
세 개의 영역으로 나눌 수 있다.
- Young -
새롭게 생성한 객체
의 대부분이 여기에 위치한다. 이 영역에서 객체가 사라질 때Minor GC
가 발생한다고 말한다.
- Old -
Young 영역에서 살아남은 객체
가 Old로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 이 영역에서 객체가 사라질 때Major GC(혹은 Full GC)
가 발생한다고 말한다.
- GC의 큰 흐름은 새로 생성된 객체가 Young 영역에 할당된다.
- GC를 통해 Young 영역에서 살아남은 객체들이 Old 영역으로 승진하여 이동한다.
- Old 영역에서 다시 GC를 통해 필요 없는 객체를 삭제한다.
5. Young 영역에서의 GC
Young 영역은 3개의 영역으로 나뉜다.
Eden 영역
Survivor 영역(2개)
- 새로 생성한 대부분의 객체는 Eden 영역에 위치하게 된다. (만약 생성된 객체가 Eden 영역의 크기보다 크다면 바로 Old 영역으로 이동하게 된다.)
- Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 0,1 중 하나로 이동된다.
- Eden 영역에서 GC가 발생하면 Survivor 0, 1 영역 중 객체가 살아있는 영역에 계속해서 살아남은 객체들이 쌓인다.
- Survivor 0,1 영역 중 한 곳의 영역이 가득 차면 다른 영역의 Survivor 영역으로 이동하게 된다.
- 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동하게 된다.
6. Old 영역에서의 GC
기본적으로 Old 영역에서의 GC는 공간이 가득 차면 GC를 실행하는데, GC방식에 따라 처리절차가 여러 가지이다.
각 상황에 맞게 최적화된 GC방법이 여러 개 있으니 찾아보자