Java Application 은 기본적으로 JVM 에서 구현된다.
자바를 처음 공부할 때, 자바 언어의 장점/특징을 배우는 과정에서 garbage collection 이 존재한다라고 배운다.
그런데 이 가비지 콜렉션이 정확히 무엇인지를 가르켜주지는 않는다.
garbage collection은 약칭 GC라고 사용한다.
자바에서 사용하는 자료형 중, 원시 자료형이 아닌 참조형 자료형들은 객체 생성 시 스택 메모리 영역이 아니라 힙 메모리 영역에 데이터 값, 주소 들을 저장한다.
원시 자료형은 기본적으로 스택 메모리에 저장되기 때문에 해당 클래스 구동이 끝나면 static 클래스 변수가 아닌 이상 메모리에서 사라진다.
하지만 참조형 객체의 경우, heap 메모리 영역에 계속해서 남아있게 된다.
프로그램이 가벼울 경우에는 상관이 없지만, 코드가 길어지고 프로그램 구동이 복잡해지면
이렇게 불필요하게 누적된 heap 메모리의 데이터가 쌓이고 쌓여서 memory leak 을 일으킨다.
이것을 방지하기 위해 사용하지 않는 객체들을 정리해줘야 하는데,
자바의 경우 GC라고 불리는 프로그램이 내장되어 있다. 그리고 GC가 이러한 사용하지 않는 객체들을 정리해준다.
자바의 heap 메모리 영역을 그림으로 나타내면 아래와 같다.
가장 기본적으로 Young generation 과 Old Generation 으로 나뉘는데 New Generation 은 아래와 같은 3가지로 나뉜다.
객체가 처음 생성되면 heap 메모리의 Edan 영역에 저장이 된다.
저장된 객체는 주기적으로 사용되고 있는지, 아닌지를 검사받으며
Edan 영역에 계속해서 새로운 객체 메모리가 저장될 때까지 살아남은 객체 정보는
Servior 0 영역으로 이동하며 저장된다.
Servior 0 영역에서도 계속해서 살아남는다면 순차적으로 Servior 1, Old 순으로 이동한다.
단!
객체 데이터의 사이즈가 너무나 커서 Servior 영역에서 감당이 불가능하다면
Edan 영역에서 바로 Old 영역으로 이동하여 저장되기도 한다.
Old 영역에 들어갈 만큼 계속해서 살아남은 객체 정보는
풀 GC, 메이저 GC 가 발생하지 않는 이상 GC가 발생하지 않는다. 즉 더이상 삭제되지 않는다.
마이너 GC : Young generation 을 대상으로 하는 GC
메이저 GC : Old 영역을 대상으로 하는 GC
풀 GC : 모든 메모리 영역을 대상으로 하는 GC