GC(Garbage Collector)

GC는 아무도 참조하지 않는 객체의 메모리를 해제해주는 기능(가비지 컬렉션)을 한다.

GC 알고리즘 2가지

Reference Counting

  • 각각의 객체는 Reference Counting 을 하며 Reference Count가 0인 객체를 가비지 컬렉션한다.
  • 단점: 순환 참조 문제

Mark And Sweep

  • root 영역에서부터 참조값을 확인하여 참조하지 않는 객체를 가비지 컬렉션한다.
  • 장점: 순환 참조 문제 해결 가능
  • 단점: 애플리케이션과 GC 실행이 병행된다. / 의도적으로 GC를 실행시켜야 한다.
    (가비지 컬렉션의 주체는 GC이므로 의도적으로 GC를 실행시키는건 레퍼런스 카운트도 마찬가지인듯)

JVM 메모리 구조

모든 쓰레드가 공유하는 영역

- 메서드, 힙 영역

 

각 쓰레드마다 고유하게 생성하며 쓰레드 종료 시 소멸하는 영역

 

- 스택, PC Register, Native Method Stack 영역

 

Method 영역

  • 메서드들의 코드를 저장
  • static 변수 등이 속함

Heap 영역

  • new 인스턴스가 속함

Stack 영역

  • 로컬 변수, 중간 연산 결과 등이 속함

Mark And Sweep 알고리즘이 참조값을 확인하는 root 영역

  • 메서드 영역의 static 변수
  • stack 영역의 로컬 변수
  • native method stack 영역의 저수준 언어의 객체

GC 동작 순서

 

자바 8기준의 GC 동작 순서이며, 위의 그림을 참고하자.

 

1. Heap 영역에 위와 같은 구조의 단위 영역을 만든다.

2. 객체 생성 시 Eden 영역에 추가되고 Eden 영역이 다 차면 GC가 일어난다.
(Minor GC)

3. GC 후 남은 객체들은 age bit가 1 증가하고 survival 영역으로 이동한다.
(survival 영역 0, 1 중 둘 중 하나는 비어있고, Minor GC 마다 둘 중의 한 영역으로 이동 시킨다.)

Eden이 처음 다 찼을 때(1번째 Minor GC)
Eden이 두번째로 다 찼을 때(2번째 Minor GC)

4. 위와 같은 과정을 반복하고, age bit가 특정 수치에 도달하면 Old Generation 영역으로 이동한다.
(Promotion 이라고 함)

5. Old Generation 영역이 다 차면 GC가 일어난다.(Major GC)


GC의 종류

여러 종류가 있지만 Pararell, G1 만 간단하게 소개하겠다.

Pararell

자바 8의 default GC 이며, 여러 개의 쓰레드로 가비지 컬렉션을 수행하여 Stop-The-World가 짧다. 

G1

자바 9부터의 default GC 이며

GC 동작 순서는 비슷하지만 힙 영역에 단위 영역 할당 방식에 차이가 있다.

G1 GC는 아래 그림처럼 힙 영역에 Region 이라는 단위로 나누어 메모리를 할당한다.

이 영역들이 Eden, Survival, Old Generation 의 역할을 한다.

기존 GC에서는 힙 영역에 Young, Old Generation 을 포함한 구조의 단위 영역을 만들었다.

따라서 이 단위 영역에서 사용하지 않는 메모리들은 낭비가 된다.(메모리 파편화)

G1 에서는 아래처럼 Region으로 관리하여 메모리 파편화를 줄인다.

 

 

참고자료)

테코톡 GC영상

'언어 > Java' 카테고리의 다른 글

Builder 패턴을 사용해야하는 이유  (0) 2023.09.23

+ Recent posts