Android - Garbage Collection(GC)
Garbage Collection
Java는 Garbage Collection(GC)을 이용하여 메모리를 관리한다.
필요에 따라 GC가 실행되고, 그 과정에서 사용하지 않는 객체들을 정리해 준다.
Garbage Collection의 동작 원리
아래 기술되는 내용은 GC의 모든 것을 다루지 않는다.
그저 GC라는 것이 있고 그것이 어떤 방식으로 돌아간다- 하는 간략한 요약 정도일 뿐이다.
1. 자바에서는 Garbage Collection(또는 GC)를 이용하여 메모리를 정리한다.
1-1. GC는 더이상 사용되지 않는 쓰레기 객체들을 정리하는 작업을 한다.
1-2. GC는 필요에 따라 자동으로 실행된다. (2-2의 경우에 실행된다.)
2. GC에 의해 관리되는 메모리는 Young과 Old로 나뉜다.
2-1. Young은 3단계로 다시 나뉜다. (Eden, Survivor 1, Survivor 2)
2-2. 객체가 GC에 의해 정리되지 않고 오래 살아남을수록 Eden -> Survivor 1 -> Survivor 2 -> Old로 이동된다.
2-2. 각 메모리 영역에 할당된 메모리가 적정 수치를 넘었을 때 GC가 실행된다.
3. GC는 Mark & Sweep 방식으로 동작한다.
3-1. GC가 실행되면, 아래와 같이 외부에서 접근할 수 있는 객체들을 GC Root로 설정한다.
- 실행 중인 쓰레드 (Active Thread)
- 정적 변수 (Static Variable)
- 로컬 변수 (Local Variable)
- JNI 레퍼런스 (JNI Reference)
3-2. GC Root에서 출발하여, 참조되고 있는 변수들을 순차적으로 Mark한다. (Mark)
3-3. Mark되지 않은 객체들은 쓰레기 객체로 판정하고 정리한다. (Sweep)
4. GC가 발생하는 동안은 stop-the-world 상태가 된다.
4-1. 객체 참조를 정확히 판단해야 하기 때문에, GC 과정에서 참조가 변경되면 안 된다.
4-2. 참조를 유지하기 위해 GC 실행시간 동안은 모든 작업이 멈춘다. (stop-the-world)