์๋ฆฌ์ GC ์์์ ๋ณด๊ณ ์ ๋ฆฌํ ๋ด์ฉ์
๋๋ค.
JVM์์ GC๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์๊ณ ์๋ค๋ฉด, ์ฑ๋ฅ ํ๋๊ณผ ๋ฉ๋ชจ๋ฆฌ ํจ์จ ๊ด๋ฆฌ์ ํฐ ๋์์ด ๋ฉ๋๋ค.
๐ GC(Garbage Collection)์ด๋?
JVM์ Heap ์์ญ์์ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ญ์ ํ๋ ํ๋ก์ธ์ค
- Heap์๋
String, List, ์ปค์คํ
ํด๋์ค ๋ฑ ์ค๋ธ์ ํธ ํ์
๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋จ
- ์ด๋ค ๊ฐ์ฒด๊ฐ ์ญ์ ๋์์ธ์ง ์ด๋ป๊ฒ ๊ตฌ๋ถํ ๊น?
๐ GC์ ์๊ฑฐ ๋์: Reachability

- GC๋ GC Root์์๋ถํฐ ์ฐธ์กฐ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ค๋ง ๋จ๊ธฐ๊ณ ๋๋จธ์ง๋ฅผ ์ญ์
- ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ unreachable ํ๋ค๊ณ ํ๋จ โ GC ๋์
GC Root๊ฐ ๋ ์ ์๋ ์กฐ๊ฑด
- Stack ์์ญ์ ์ง์ญ ๋ณ์
- Method ์์ญ์ static ๋ณ์
- JNI๋ก ์์ฑ๋ ๊ฐ์ฒด ๋ฑ

โ๏ธ GC์ ๋์ ๋ฐฉ์
Mark and Sweep ์๊ณ ๋ฆฌ์ฆ
| ๋จ๊ณ | ์ค๋ช
|
|---|
| Mark | GC Root๋ถํฐ ๊ฐ์ฒด๋ฅผ ํ์ํ๋ฉฐ ์ฐธ์กฐ๋ ๊ฐ์ฒด์ ๋งํน |
| Sweep | ๋งํน๋์ง ์์ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ |
| Compact | ๋จํธํ ๋ฐฉ์ง๋ฅผ ์ํด ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ ํ ๊ณณ์ผ๋ก ์ด๋ (์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ์ต์
) |
๐ง JVM Heap ๊ตฌ์กฐ์ GC ๋ฐ์ ์์

| ์์ญ | ์ค๋ช
|
|---|
| Young Generation | ์๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋จ (Eden, Survivor) |
| Old Generation | ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋จ |
| Metaspace | ํด๋์ค ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ (Java 8๋ถํฐ PermGen โ Metaspace๋ก ๋์ฒด๋จ) |
๐งช Minor GC์ ๊ฐ์ฒด ์์กด
Eden โ Survivor โ Old๋ก ๊ฐ์ฒด ์ด๋

- Eden์ด ๊ฐ๋ ์ฐจ๋ฉด Minor GC ๋ฐ์
- Survivor0 โ Survivor1์ ๋ฒ๊ฐ์ ์ฌ์ฉ (ํ์ชฝ์ ํญ์ ๋น์๋ฌ์ผ ํจ)

- ๊ฐ์ฒด์ ์์กด ํ์(Age)๊ฐ ๊ธฐ์ค์น๋ฅผ ๋์ผ๋ฉด Old Generation์ผ๋ก ์ด๋
๐ฅ Major GC
- Old Generation์ด ๊ฐ๋ ์ฐผ์ ๋ ๋ฐ์
- Minor GC๋ณด๋ค ๋น์ฉ์ด ํฌ๊ณ ์๊ฐ๋ ์ค๋ ๊ฑธ๋ฆผ
- Major GC๋ ์ต์ํํ๋ ๊ฒ์ด ์ข์
๐ก GC๊ฐ ์ ์ ํ๋ ๊ฐ์ค (Weak Generational Hypothesis)
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ Unreachable ์ํ๊ฐ ๋๋ค.
- ์ค๋๋ ๊ฐ์ฒด์์ ์ ์ ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ๋งค์ฐ ์ ๋ค.

- ํ๋์: ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๊ณ ์๋ ๊ฐ์ฒด๋ค
- Minor collections: Minor GC์ด๋ผ ์๊ฐํด๋ฉด ์ดํดํ๊ธฐ ํธํ๋ค
- Minor GC๊ฐ ๋ฐ์ํ๊ณ ๊ฝค ๋ง์ ๊ฐ์ฒด๋ค์ด ์๊ฑฐ๋๋ ๋ชจ์ต์ ๋ณผ ์ ์์ -> ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ง์
- ๋ฐ๋ฉด major gc๋ ํ ๋ฒ ์ผ์ด๋๋ ์๊ฑฐ๋๋ ๊ฐ์ฒด๊ฐ ๋ณ๋ก ์๋ค.
GC๋ young ์์ญ์์ ๋ ์์ฃผ GC๋ฅผ ์ํํ๋ฉฐ, old ์์ญ์ ๋ ๋น๋ฒํ๊ฒ ์ํ
๐งจ Stop-The-World๋?
GC ์ํ ์ JVM์ด ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์
์ค๋ ๋๋ฅผ ๋ฉ์ถ๊ณ GC ์ ์ฉ ์ค๋ ๋๋ง ๋์ํ๋ ์ํ
- GC ์ข
๋ฅ์ ๋ฐ๋ผ STW ์๊ฐ์ด ๋ค๋ฆ
- ์ฑ๋ฅ ๋ณ๋ชฉ์ ์์ธ์ด ๋ ์ ์์ โ GC ์ข
๋ฅ ์ ํ์ด ์ค์ํจ
๐งฌ GC ์ข
๋ฅ ์ ๋ฆฌ
Serial GC
- ๊ฐ์ฅ ๋จ์ํ๊ณ ๊ธฐ๋ณธ์ ์ธ GC
- ๋จ์ผ ์ค๋ ๋๋ก ์ํ
- ๋ค๋ฅธ GC๋ค์ ๋นํด STW ์๊ฐ์ด ๊น
Parallel GC
- java 8์ ๊ธฐ๋ณธ GC
- Young GC๋ฅผ ๋ฉํฐ ์ค๋ ๋๋ก ์ฒ๋ฆฌ
Parallel Old GC
- Parallel GC์ ๊ฐ์ ๋ฒ์
- Old ์์ญ์์๋ ๋ฉํฐ ์ค๋ ๋๋ก ์ฒ๋ฆฌ
- Mark-Summary-Compact ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ
Sweep: ๋จ์ผ ์ค๋ ๋๊ฐ Old ์์ญ์ ํ๋๋ค.
Summary: ๋ฉํฐ ์ค๋ ๋๊ฐ Old ์์ญ์ ๋ถ๋ฆฌํด์ ํ๋๋ค.
CMS GC
- STW ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ๊ณ ์๋จ
- Reachableํ ๊ฐ์ฒด๋ค์ ํ๋ฒ์ ์ฐพ์ง ์๊ณ ์์ฐจ์ ์ผ๋ก ์ฐพ์
- ๋จ์ผ ์ค๋ ๋๋ก GC๋ฅผ ์ฒ๋ฆฌํ์ง๋ง ๋๋จธ์ง ์ค๋ ๋๋ค์ ์์
์ ๊ณ์ ์งํํจ
- Compact ์์ (๋จํธํ ๋ฌธ์ ์์)
G1 GC (Garbage First)
- CMS GC๋ฅผ ๊ฐ์
- Java 9+์ ๊ธฐ๋ณธ GC
- Region ๊ธฐ๋ฐ์ผ๋ก ๋์
- Compact ๊ฐ๋ฅ
๐ง ๋ง๋ฌด๋ฆฌ
GC๋ JVM์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋๋ก ๋๋ ์ค์ํ ๊ธฐ๋ฅ์ด๋ค.
- GC๊ฐ ์ธ์ , ์ด๋ค ์์ญ์์, ์ด๋ป๊ฒ ๋์ํ๋์ง๋ฅผ ์ดํดํ๋ฉด
- ์ ํ๋ฆฌ์ผ์ด์
์ฑ๋ฅ ํ๋๊ณผ ์ฅ์ ๋ถ์์ ํฐ ๋์์ด ๋๋ค
๐ฅ ์ฐธ๊ณ ์๋ฃ
๐ฅ์๋ฆฌ์ GC