본문 바로가기
개발공부/Java

[JVM GC] Garbage Collector에 대하여

by sangyeon 2022. 1. 4.
728x90

1. GC(Garbage Collector)

이름에서 보이는 바와 같이 GC란 JVM 메모리를 자동으로 관리해주는 역할을 한다. (쓰레기 수집)

좀 더 전문적으로 이야기하면 JVM 메모리 중 Heap 영역에서 사용하지 않는 객체를 삭제하여 관리해주는 기능을 한다.

 

1.1 STW (Stop The World)

GC를 하며 메모리가 관리되는 동안 자바 어플리케이션이 멈추는 현상이 있는데 이를 Stop The World라고 부른다.

이 때, GC 스레드를 제외한 모든 스레드는 멈추게 된다.

 

 

2. GC 구조

일반적으로 GC구조(단일/병렬/CMS)는 Young 영역과 Old 영역으로 나뉜다.

 

이미지 출처 - https://www.javamadesoeasy.com/2016/10/jvm-heap-memory-hotspot-heap-structure.html

 

2-1. Young Generation

Young 영역은 크게 3가지로 나뉜다.

  • Eden 영역, Survivor1 영역, Survivor2 영역
  • Young 영역에서 발생하는 GC를 Minor GC라고 부른다.

 

Eden(에덴) 영역

  • 새롭게 생성된 객체가 위치하는 공간
  • Eden 영역이 가득 차면 Minor GC가 발생하면서 Mark & Sweep 과정이 발생한다.  (Mark : 접근 가능한 객체에 Mark하여 표시, Sweep : Mark되지 않은 객체들을 제거하는 과정)
  • Mark되어 아직 사용 중인 객체는 Survivor 영역으로 이동하며 Eden 영역은 비워진다.

 

Survivor 영역

  • 또 다시 Eden 영역이 가득 차게 되면 Minor GC가 발생하면서 Eden과 Survivor 영역에 접근할 수 없는 객체를 제거한다. (Mark 되지 않은 객체가 Sweep 됨)
  • Mark된 살아남은 객체는 다른 Survivor 영역으로 이동하게 된다. (S0 -> S1)
  • 이때 다른 Survivor 영역으로 이동한 객체는 age 값이 증가한다.
  • 특정 age 값을 넘어가는 경우 Old 영역으로 이동하게 된다. (Promotion)

 

2-2. Old Generation

Young 영역보다 사이즈가 크기 때문에 GC가 적게 발생하지만 반대로 GC에 소요되는 시간은 오래 걸린다.

  • Young 영역의 Survivor 영역에서 살아남은 객체들이 Old 영역에 위치하게 된다.
  • Old 영역에서 발생하는 GC를 Major GC라고 부른다.

 

2-3. Permanent Generation

class 혹은 Method 코드가 저장되는 영역이다.

  • PermGen은 Heap 영역에 속한다.
  • Default로 제한된 크기를 가지고 있다.
  • WAS 서버 기동 시 OutOfMemory PermGen이 발생한다면 클래스와 메소드 코드를 로드하는 과정에서 Perm 영역의 공간이 부족한 경우이기 때문에 -XX:PermSize와 -XX:MaxPermSize를 설정하여야 한다.

 

2-4. MetaSpace 영역

아래 글 참조

https://syhwang.tistory.com/30?category=1196279 

 

[웹로직] OutOfMemoryError: Metaspace에 대한 고찰

OutOfMemoryError에는 여러 가지 종류가 있습니다. 아래 오라클 공식 문서 참조 Understand the OutOfMemoryError Exception https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.h..

syhwang.tistory.com

 

728x90