자바는 메모리를 명시적으로 해제(C++에서 free() 와 같이)하지 않고 대신 Garbage Collection을 이용한다.
Garbage Collection이란 더 이상 사용하지 않는 객체를 찾아서 삭제하는 역활을 수행하는 것이다.
Garbage Collection은 힙영역, 메소드 영역의 것들을 대상으로 객체를 삭제한다.
구체적으로는 아래와 같은 객체들이 대상이 된다. 아래와 같은 객체들을 가비지(Garbage)라고 부른다.
1. 객체가 null
2. 블록scope가 끝난 객체들
3. 참조가 더이상 되지 않는 객체들
GC를 실행시키려면 JVM이 실행 중인 애플리케이션을 잠시 중단시여야 한다.
이렇게 GC를 위해 애플리케이션을 잠시 중단하는 것을 'stop-the-world' 라고 한다.
GC작업이 끝나면 멈췄던 애플리케이션이 다시 실행된다.
- 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다.
- 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
이러한 2가지 가설을 통해 HotSpot VM(JVM중 하나)에 2가지 물리적 공간으로 나눴다.
YOUNG 영역 : 새롭게 생성한 객체의 대부분이 위치하는 영역. 1번 가설에 의해 나눠진 영역으로, 많은 객체들이 여기서 사라진다. 이때 이 영역에서 사라질때, Minor GC가 발생했다고 한다.
OLD 영역 : 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 이때 이 영역에서 사라질때, Major GC가 발생했다고 한다.(OLD 영역은 기본적으로 데이터가 꽉 찰때 GC를 실행시킨다.)
YOUNG 영역은 3가지 영역으로 나눠진다.
1. eden 영역
2. Survivor(1) 영역
3. Survivor(2) 영역
- eden 영역 : 새로 생성한 대부분의 객체는 eden 영역에 위치한다.
- Survivor(1) 영역 : Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나(1)로 이동된다.(이 과정을 반복)
- Survivor(2) 영역 : Survivor(1) 영역이 꽉 차버리면 Survivor(1) 영역을 비우고 살아남은 객체를 Survivor(2) 영역으로 보낸다.
※ Survivor(2) 영역에서도 살아남은 객체들은 OLD영역으로 보내진다.
주의해야 할건 Survivor(1) 영역, (2) 영역 중 하나는 무조건 비워져 있어야 한다.