Garbage Collection(GC)
더이상 참조되지 않는 객체를 정리해주는 JVM의 기능
JVM 메모리 구조와 Heap 영역에서의 GC
JVM 메모리 구조
JVM이 실행되면 메모리 구조를 다음과 같이 사용함.
Heap 영역에서 이루어지는 GC
- GC는 Heap의 객체 중 필요한 것, 사용하고 있는 것을 따로 모아두고 더이상 사용하지 않는 것을 한꺼번에 처리
- 새롭게 생성된 객체는 Eden 영역에 존재
- Eden 영역의 객체 중 살아남은, 사용하는 객체는 Survivor1로 이동
- Survivor1 영역의 객체 중 살아남은, 사용하는 객체는 Survivor2로 이동
- Survivor1과 Survivor2 영역은 서로 번갈아가며 생존 객체를 주고 받으며 GC함
- Survivor1과 Survivor2 영역에 일정 기간 이상동안 살아 남아있던 객체는 오랫동안 사용할 객체로 인지하여 Old 영역으로 넘어감
-
각 영역 size는 프로그래머가 최적화할 수 있음
- 만약 Eden 영역을 늘리면 새로운 객체를 많이 저장할 수 있음
- 만약 Old 영역을 늘리면 오랫동안 존재하는 객체를 많이 저장할 수 있음
Java가 주소값이 아닌 참조값을 반환하는 이유
- GC 동작 방식을 이해한다면 java가 주소값이 아닌 참조값을 이용하고 반환하는 이유를 알 수 있음
- GC에 의해 가비지 객체를 정리할 경우 객체들은 survivor 영역에서 위치를 자주 옮기게 됨
- 따라서 주소값이 자주 바뀔 수밖에 없고, 자주 바뀌는 주소값 대신 참조값을 반환하는 것!