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 영역에서 위치를 자주 옮기게 됨
  • 따라서 주소값이 자주 바뀔 수밖에 없고, 자주 바뀌는 주소값 대신 참조값을 반환하는 것!