본문 바로가기
BackEnd/Java

[Java] 가비지 컬렉션(GC, Garbage Collection) 이란?

by 뽀뽀이v 2020. 9. 10.

GC란 동적으로 할당된 메모리에서 사용하지 않는 객체를 수집하는 역할을 한다. 메모리가 가득 차게 되면 OutofMOutOfMemmory Exception이 발생한다. 앞서 JVM 메모리 구조에 대해서 공부했다면 동적 할당되는 메모리 부분은 Heap메모리 영역이라는 것을 알고 있을 것이다. 그렇다면 Heap 메모리 구조를 살펴보자!

 

Heap 메모리 구조

Eden 영역부터 Sevior 영역까지를 Young 영역이라고 한다.

즉, 크게 Young, Old, Perm 3가지 영역으로 나누어진다.

[참고]
JDK8부터는 Perm영역이 MetaSpace영역으로 대체되었다.
MetaSpace영역은 Native 메모리를 사용하여 동적으로 공간을 확보하는 것으로 판단된다.

 

그렇다면 Heap 메로리 구조 안에서 객체는 어떻게 이동하는 것일까? 

1. 객체가 생성되면 Eden 영역에 위치한다. 

2-1. 사용 중인 객체라면 판단되면 Sevior영역으로 이동한다.

2-2. 사용하지 않는 객체라면 마이너 GC에 의해서 사라진다.

3. 위의 과정에서 살아남은 객체는 Old 영역으로 이동한다. 또는 Sevior영역보다 크다면 Old영역으로 이동한다.

 

[GC의 종류]

메이저 GC Old 영역에서 활동
마이너 GC Young 영역에서 활동
풀 GC 메모리 전체에서 활동

그렇다면 GC의 처리방식은 어떻게 될까?

 

[Old영역의 GC의 처리 방식]

  • Serial GC
  • Parallel GC
  • Parallel Old GC(Parallel Compacting GC)
  • Concurrent Mark & Sweep GC(이하 CMS)
  • G1(Garbage First) GC

자세한 알고리즘 방식은 네이버D2에서 확인하자!

 

GC에 대해서 간략하게 알아보았다. 여기서 우리가 발전하기 위해서는 성능 문제로 접근할 필요가 있다.

위에서 공부한 것을 기준으로 우리는 최대한 Heap영역의 부하를 방지하는 방법을 고민할 필요가 있다.

예를 든다면 String연산 시 StringBuilder, StringBuffer를 사용해서 연산한다거나 그런 방식 말이다. 

 

자세한 GC튜닝을 알고 싶다면 네이버D2에서 확인하자!

댓글