본문 바로가기
Backend/Java

[Java] Garbage Collector

by 제이동 개발자 2023. 7. 16.
728x90

Garbage Collector

 개발을 하다 보면 수많은 객체, 배열 등이 메모리에 할당됩니다. 하지만 메모리를 할당만 할 뿐 반환을 따로 하지 않는데 그 이유는 JVM에서 GC(Garbage Collector)가 자동으로 메모리를 관리해 주기 때문입니다. GC가 어떻게 메모리를 관리할까요?

 

 할당받은 객체나 배열 중에서 더 이상 사용하지 않는, 즉 참조하지 않는 객체, 배열들을 Garbage라고 부릅니다.

위 그림은 Garbage가 되는 하나의 예시인데 참조변수 b는 처음에 Person("춘향이")를 참조하고 있지만 b = a

대입 연산에 의해 a가 참조하는 Person("홍길동")을 참조하게 되면 기존에 참조 중이던 Person("춘향이") 객체는 더 이상 참조하는 곳이 없기 때문에 Garbage가 됩니다. 이러한 Gabage 객체들로 인해 가용 메모리 공간이 일정 크기 이하로 줄어들게 되면 JVM이 자동으로 Garbage 객체들을 회수(반환)하여 가용 메모리 공간을 확보할 수 있도록 GC(Garbage Collector)를 실행하게 됩니다.

 

 

1. GC 발생 과정

  1. 객체가 생성(할당)되면 Eden 영역에 위치
  2. Eden 영역이 가득 차게 되면 Minor GC가 현재 참조가 없는 객체들을 반환하고, 참조 중인 객체는 Survivor1으로 이동시킨다.
  3. Survivor1 영역이 가득 차게 되면 Minor GC가 현재 참조가 없는 객체들을 반환하고, 참조 중인 객체는 Survivor2으로 이동시킨다.
  4. Survivor2 영역이 가득 차게 되면 Minor GC가 현재 참조가 없는 객체들을 반환하고, 참조 중인 객체는 Survivor1으로 이동시킨다.
  5. 위 3, 4 과정을 반복하여 계속 참조 중인 객체는 Old 영역으로 이동시킨다.
  6. 또한 2, 3, 4 과정 중 객체의 메모리가 이동하려는 영역의 가용 메모리보다 크면 Old 영역으로 이동시킨다.
  7. Old 영역이 가득 차게 되면 Major GC가 현재 참조가 없는 객체들을 반환한다.

 

 

2. GC의 종류

2-1. Serial GC

 Serial GC는 CPU 코어가 하나일 때 사용되던 GC로 단일 스레드로 동작하는 가장 간단한 GC입니다. 작은 힙 크기에서 가장 효과적이지만 단일 스레드로 동작하기 때문에 GC가 실행되면 다른 모든 스레드는 일시 정지된다는 단점이 있습니다.

 

2-2. Parellel GC(Java 8 Default GC)

 Paralle GC는 Serial GC와 같은 알고리즘입니다. 그러나 Serial GC는 CPU 코어가 하나일 때 쓰는 방식으로 스레드가 하나였지만 Parallel GC는 요즘 CPU에 맞게 여러 스레드를 사용하는 방식입니다. 따라서 GC를 처리하는 스레드가 여러 개이므로 병렬로 빠르게 객체를 처리할 수 있습니다. Paralle GC는 메모리가 충분할수록, 코어의 개수가 많을수록 좋은 성능을 갖습니다.

 

2-3. CMS GC

 STW(STOP-THE-WORLD) 시간이 짧은 장점을 갖고 있는 GC로 응답 속도가 중요할 때 CMS GC를 사용합니다. CMS GC의 특징으로는 다른 스레드가 실행 중인 상태에서 진행됩니다. 때문에 STW의 시간이 줄어든다는 장점이 있지만 메모리와 CPU를 많이 사용한다는 단점이 있습니다.

 

2-4. G1 GC(Java 11 Default GC)

 G1 GC는 2차원 형태로 일정 크기의 Region으로 논리적으로 구분하는 GC입니다. 여태까지 GC과정에서의 Heap 메모리는 Young 영역과 Old 영역으로 명확하게 구분하였지만 G1 GC에서는 2차원 공간에 Region으로 구분된 단위로 Eden, Survivor, Old 영역이 2차원 공간 안에 랜덤 하게 나누어져 있습니다. 때문에 대규모 힙 크기와 많은 양의 객체가 있는 시스템에서 효과적입니다.

728x90