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 마다 둘 중의 한 영역으로 이동 시킨다.)


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으로 관리하여 메모리 파편화를 줄인다.

참고자료)
'언어 > Java' 카테고리의 다른 글
Builder 패턴을 사용해야하는 이유 (0) | 2023.09.23 |
---|