[JAVA] Garbage Collection

김상인·2022년 10월 2일
0

자바

목록 보기
2/3
post-thumbnail

Garbage Collection

C언어 배울 때 malloc과 free 키워드로 메모리를 동적으로 할당하고 해제하는 것을 배웠었다. 하지만 자바에서는 new 키워드로 메모리에 동적으로 할당하는데 해제하는 키워드가 없다.
그 이유가 무엇일까?
바로 자바는 가비지 컬렉션이 애플리케이션의 동적 메모리 할당 요청을 자동으로 관리하고 또 재사용할 수 있도록 사용되지 않은 메모리를 회수해주기 때문이다.

가비지 컬렉션의 대상 객체

Reachable: 객체가 참조되고 있는 상태
Unreachable: 객체가 참조되고 있지 않은 상태

힙 영역을 제외한 다른 영역에서 힙 영역에 생성된 객체의 주소만 참조하는 형식으로 구성된다.
따라서 참조하고 있지 않다면 힙 영역의 객체가 Unreachable이 되어 일정 주기로 가비지의 컬렉터가 제거해준다.

그렇다면 어떻게 가비지 컬렉션이 Unreachable 객체들을 찾아내어 제거하는 것일까?

Mark And Sweep

Mark And Sweep 알고리즘은 가비지 컬렉션이 동작하는 원리로 Root Set에서 부터 시작한 참조 사슬에 속한 객체들은 reachable 객체이고, 이 참조 사슬과 무관한 객체들은 Unreachable이 된다. 우선알고리즘을 알아보기 전 Root Set이 무엇인지 알아보자

Root Set

  • Java 메서드 실행 시에 사용하는 지역 변수와 파라미터들에 의한 참조
  • 네이티브 메소드 스택(Java Native Interface)에 의해 생성된 객체에 대한 참조
  • 메서드 영역의 static와 같은 정적 변수에 의한 참조

위에 해당하는 것들이 root set에 해당 되어 여기 부터 순회하여 객체들을 찾아낸다.

Mark: Root Set으로 부터 순회하여 모든 객체를 마킹한다.
Sweep: 마킹이 안된 객체들을 메모리에서 제거한다.
Compact: Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 압축한다.

힙 영역

  • Young 영역: 새롭게 생성한 객체의 대부분이 여기에 위치한다. 이 영역에서 객체가 사라질 때 Minor GC가 발생한다고 한다.
  • Old 영역: Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC가 발생한다고 말한다.

- 힙 영역을 Young과 Old로 나눈 이유

  1. 대부분의 객체 새로 생성되고 금방 Unreachable 객체가 된다.
  2. Old 객체에서 Young 객체의 참조는 아주 적게 존재한다.

Old 객체보단 새로 생성되고 사라지는 객체가 많고 힙 전체 영역을 GC하기 에는 시간이 많이 걸리므로 두 영역으로 나누어 놓고 GC를 진행하는 것이 효율적이다.

- Young 영역의 구성

Young 영역은 Eden, Survivor(2개) 영역으로 나뉜다.
자세한 내용은 아래 동작 원리와 함께 알아보자.

동작 원리

1.


새로 생성한 대부분의 객체는 Eden영역에 생성된다.

2.


Eden영역에 가득 차면 Minor GC가 발생하고 reachable객체들만 Survivor 0으로 이동한다.

3.


다시 Eden영역에 가득 차면 Minor GC가 발생하고 비어 있는 Survivor 영역으로 reachable객체들만 모두 이동한다.

4.


위 과정을 계속 반복하다가 일정 이상으로 살아남은 객체들은 오랫동안 쓰일 객체라고 판단하고 Old 영역으로 이동시킨다.

5.


Old 영역에 객체가 가득 차면 Old 영역의 모든 객체들을 순회하여 Unreachable 객체들을 한꺼번에 제거하는 Major GC가 실행된다. Old 영역은 매우 크기 때문에 Major GC 작업이 오래 걸리고 이때 GC를 실행하는 스레드를 제외한 모든 스레드는 작업을 멈추게 된다는 단점이 있다.

profile
백엔드 희망자

0개의 댓글

관련 채용 정보