JVM의 Garbage Collector는 Heap 영역에 생성된 메모리가 Stack을 통해 도달하지 못하는 상황에 Heap 메모리를 정리해준다. 이러한 메모리는 Unreachable Memory라고 한다.
또한, Java의 gc 과정에 있어서 매우 중요한 개념이 있다. 그것은 바로 stop the world
이다.
: GC를 실행하기 위해 JVM이 application 실행을 멈추는 것. Stop the world가 발행하면 GC를 실행하는 쓰레드 외의 나머지 쓰레드는 모두 작업을 멈춘다. 어떤 GC를 사용하더라도 이 Stop the Word는 발생하는데, 대개의 경우 GC 튜닝이란 Stop the World의 시간을 줄이는 것이라고 한다.
GC에는 다양한 알고리즘이 존재하는데, 기본적인 Java Garbage Collection에 대해서 정리해보려고 한다. 또한, 가장 일반적인 JVM인 Hotspot JVM의 GC 과정에 대해서 알아보도록 하자.
기본적으로 C와 같은 언어는 개발자가 직접 메모리에 대해 free()
를 해야하지만, java는 스스로 쓰지 않는 메모리에 대해서 deallocating을 해준다. 아주 기본적인 automatic gc의 동작은 다음과 같다.
1. Marking
사용하지 않는 메모리를 표시한다.
2. Normal Deletion
사용하지 않는 메모리를 지운다.
3. Deletion with compaction
쓰지 않는 메모리를 지움과 동시에, 퍼포먼스를 위해 메모리에 대한compaction 과정을 거친다. 레퍼런스 되어있는 object 위치를 같이 옮김으로써, 새로운 메모리 할당을 더 빠르고 쉽도록 만든다.
java에서는 프로그램 코드에서 명시적으로 가비지 콜렉팅을 하지 않는다. System.gc()
를 불러서 명시적으로 해제를 할 수 있지만, 이는 시스템 성능에 큰 영향을 끼치므로 절대 사용하면 안된다고 한다.
따라서 가비지 컬렉터는 자신이 스스로 알아서 가비지 콜렉팅을 한다. 가비지 컬랙터는 다음 두가지 가설을 기반으로 만들어졌다.
1. 대부분의 객체는 빠르게 unreachable하게 된다.
2. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
이러한 가설을 Weak Generational Hypothesis
라고 한다. 이러한 장점을 살리기 위해서 힙 공간을 크게 Young과 Old라는 두개의 공간으로 나눈다.