1. GC (Garbage Collector)
JVM에는 메모리를 자동으로 관리해주는 특징이 있는데, 이 역할을 Garbage Collector
(가비지 콜렉터)이 한다.
- 정확히는 JVM 메모리 중 Heap 영역에서 사용하지 않는 객체를 삭제하여 관리해줌
1.1. Stop The World
GC에는 stop-the-world
라는 것이 존재하여, 메모리가 관리되는 동안 Java Application이 멈추는 현상을 말한다.
stop-the-world
가 발생하는 동안 GC 스레드를 제외한 모든 스레드가 멈춤
stop-the-world
가 발생하는 시간이 줄이기 위해 JVM 튜닝을 하곤하는데, 튜닝을 위해서는 JVM GC
에 대해 살펴볼 필요가 있다.
2. 일반적인 GC 구조
일반적인 GC 구조는 Young Generation
과 Old Generation
으로 나눠진다.
- 일반적이라는 말을 쓴 이유는
JVM GC
종류 중G1GC
는 아래 구조와 다른 구조를 가지기 때문 - G1GC는 young, old, survivor 영역이 2차원 바둑판 형태로 부분적으로 나눠져있는 구조를 가짐

Permanent Generation은 Java 8 이상부터는 제거되었기 때문에, Young/Old Generation에 집중해서 살펴본다.
2.1. Young Generation
Young Generation
은 크게 3가지 영역으로 나눠진다.
Eden
영역 1개,Survivor
영역 2개- Young 영역에서 발생하는 GC를
Minor GC
라고 함
Eden(에덴) 영역
- 새롭게 생성된 객체가 위치하는 공간
- Eden 영역이 꽉 차면, GC가 발생하면서
Mark & Sweep
과정이 일어난다.- 접근할 수 없는 객체(
unreachable object
)가 제거 됨
- 접근할 수 없는 객체(
- 이때, 발생하는 GC를
Minor GC
라고 함 - 아직 사용중인 객체는
Survivor
영역으로 이동하며,Eden
영역은 비워진다.
Survivor 영역
- 또 다시 Eden 영역이 꽉 차게 되면, GC가 발생하면서 Eden과 Survivor 영역에 접근 할 수 없는 객체를 제거한다.
- 나머지 살아남은 객체는 다른 Survivor 영역으로 이동하게 된다.
- 이때, 다른 Survivor 영역으로 이동한 객체는
age
값이 증가한다. - 계속해서 살아남은 객체들은 2개의 Survivor 영역을 이동하면서, 특정
age
값을 넘어가는 경우Old Generation
으로 이동하게 된다.- 이 과정을
promotion
이라고 함
- 이 과정을
2.2. Old Generation
Young 영역보다 크기 때문에 GC가 적게 발생하고, 시간은 오래걸린다.
- 크기가 크니깐 그만큼 객체를 더 많이 가질 수 있기 때문에 꽉 차는데 오래걸림. 반대로 제거할때는 오래걸림
Old 영역에서 발생하는 GC를 Major GC
라고 함
Young 영역의 Survivor 영역에서 살아남은 객체들이 Old Generation에 위치하게 된다.
2.3. Permanent Generation
Permanent 영역은 Java8부터는 사라지고, Mataspace 영역으로 전환되었다.
Java 7
<kotlin />
<----- Java Heap -----> <-- Perm --> <--- Native Memory --->
+------+----+----+-----+-----------+--------+--------------+
| Eden | S0 | S1 | Old | Permanent | C Heap | Thread Stack |
+------+----+----+-----+-----------+--------+--------------+
S0: Survivor 0
S1: Survivor 1
Java 8+
<kotlin /><----- Java Heap -----> <--------- Native Memory ---------> +------+----+----+-----+-----------+--------+--------------+ | Eden | S0 | S1 | Old | Metaspace | C Heap | Thread Stack | +------+----+----+-----+-----------+--------+--------------+
GC 종류와 상세한 동작 과정은 아래 내용 참고
2021/03/07 - [Language/JAVA] - JVM GC 동작 순서와 GC 종류(Serial / Parallel / CMS / G1 GC )
JVM GC 동작 순서와 GC 종류(Serial / Parallel / CMS / G1 GC )
JVM GC 동작 순서 요약하면 GC 동작은 아래 3 STEP으로 나눠진다. Heap 영역에 존재하는 객체들에 대해 접근 가능한지 확인한다. GC Root 에서 부터 시작하여 참조값을 따라가며 접근 가능한 객체들에 Ma
memostack.tistory.com
3. 관련 글
2021/03/07 - [Language/JAVA] - JVM 메모리 (Runtime Data Area)
JVM 메모리 (Runtime Data Area)
Runtime Data Area JVM 메모리를 뜻함 Runtime Data Area 는 5개 영역으로 나눠짐 Method Area , Heap , Stack , PC Register , Native Method Area Method Area 와 Heap 은 모든 스레드가 공유하는 공간 Stack ,..
memostack.tistory.com
'Language > JAVA' 카테고리의 다른 글
Java의 String과 StringBuilder, StringBuffer 비교 (0) | 2021.03.07 |
---|---|
JVM GC 동작 순서와 GC 종류(Serial / Parallel / CMS / G1 GC ) (0) | 2021.03.07 |
JVM 메모리 (Runtime Data Area) (0) | 2021.03.07 |
JVM과 JVM 아키텍처 (Class Loader, Runtime Data Area, Execution Engine) (0) | 2021.03.07 |
Java - 연산자의 종류 (증감/부호/산술/논리/비교/대입 연산자) (0) | 2021.02.03 |