์ด์ ์ GC ๋ฅผ ํ์ตํ๋ฉด์ ๊ฐ๋จํ ์ ๋ฆฌํ๋ ๋ด์ฉ
1. Garbage Collector ??
Garbage Collector ๋ JVM ์ ๊ตฌ์ฑ ์์ ์ค ํ๋๋ก ์ฐธ์กฐํ๊ณ ์์ง ์๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฐํํ๋ ์ญํ ์ ํ๋ ์ปดํฌ๋ํธ์ด๋ค. ์ฆ, ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ง์ฐ๋ ์ญํ ์ ํ๋ค. Java ์ ํจ๋ฌ๋ค์ ์ค ํ๋์ธ "๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํ ๋นํ๊ณ ํ ๋น ํด์ ํ๋ฏ๋ก ํ๋ก๊ทธ๋จ์ด ํด๋น ์์ ์ ๋ถ๋ด์ ๋๋ผ์ง ์๋๋ค." ๋ ์ทจ์ง์์ Garbage Collector ๊ฐ ๋์ ๋์๋ค.
(3) Automatic Garbage Collection - Java automatically allocates and deallocates memory so programs are not burdened with that task.
2. ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ์ - Generational Garbage Collection
GC ๋ฅผ ์คํํ๊ธฐ ์ํด์๋ JVM ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ์ ๋ฉ์ถ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํด์ผ ํ๋ค. ์ด ๊ณผ์ ์ ํ๋ง๋๋ก stop-the-world ๋ผ ๋งํ๋ค. ๋ค๋ฅธ ๋ง๋ก๋ GC ๊ฐ ์คํ๋๋ ๋์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฉ์ถฐ ์์ด์ผ ํ๋ค. ๋ง์ฝ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ค๋ซ๋์ ๋ฉ์ถฐ์๋ค๋ฉด ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์๊ณ ์ฌ์ฉ์์๊ฒ ๋์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์๊ธฐ ๋๋ฌธ์ GC ํ๋์ ํตํด stop-the-world ์๊ฐ์ ์ค์ฌ์ผ ํ๋ค.
GC ์ ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ ์ฐธ์กฐ๋์ง ์๋ ์ํ๊ฐ ๋๋ฉฐ, ์ค๋๋ ๊ฐ์ฒด์ ์ ์ ๊ฐ์ฒด ์ฐธ์กฐ๋ ์ ๊ฒ ์กด์ฌํ๋ค๋ ๊ฐ์ค์ ๊ธฐ๋ฐํ๋ฉฐ HotSpot VM ์ Young Generation ์ Old Generation ๋ก ๊ณต๊ฐ์ ๋๋์ด ๊ด๋ฆฌํ๋ค.
- Young Generation : ์๋กญ๊ฒ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์์นํ๋ ์์ญ์ด๋ฉฐ ๋๋ถ๋ถ ๊ธ๋ฐฉ ์ฐธ์กฐ๋์ง ์๋ ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ํด๋น ์์ญ์์ ์์ฑ๋์๋ค๊ฐ ์ฌ๋ผ์ง๋ค. ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๋ ๊ณผ์ ์ Minor GC ๋ผ ๋ถ๋ฅธ๋ค.
- Old Generation : YoungGeneration ์์ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ๋ณต์ฌ๋๋ ์์ญ์ด๋ค. YoungGeneration ๋ณด๋ค ํฐ ํฌ๊ธฐ๋ก ํ ๋น๋๋ฉฐ, ํฐ ํฌ๊ธฐ ๋งํผ GC ๊ฐ ์ ๊ฒ ๋ฐ์ํ๋ค. ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๋ ๊ณผ์ ์ Full GC ๋ผ ๋ถ๋ฅธ๋ค.

3. Young Generation ๊ตฌ์ฑ
Young Generation ์ ๊ฐ์ฒด๊ฐ ์ ์ผ ๋จผ์ ์์ฑ๋๋ ๊ตฌ๊ฐ์ด๋ค. Young Generation ์ Eden ์์ญ๊ณผ 2๊ฐ์ Survivor ์์ญ์ผ๋ก ์ด 3๊ฐ์ ์์ญ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ๊ฐ ์์ญ์ ์ฒ๋ฆฌ ์์๋ ์๋์ ๊ฐ๋ค.
- ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ Eden ์์ญ์ ์์นํ๋ค. Eden ์์ญ์์ Minor GC ๊ฐ ๋ฐ์ํ๊ณ ์ด์๋จ์ ๊ฐ์ฒด๋ Survivor ์์ญ์ผ๋ก ์ด๋ํ๋ค.
- Eden ์์ญ์์ Minor GC ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์ด์๋จ์ ๊ฐ์ฒด๋ Survivor ์์ญ์ผ๋ก ์ด๋ํ๋ฉฐ ๊ฐ๋ ์ฐจ๊ฒ ๋ ๊ฒฝ์ฐ, ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ์ฎ๊ฒจ์ง๋ค. (ํ๋์ Survivor ์์ญ์ ๋น ๊ณต๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ค.)
- ํด๋น ๊ณผ์ ์ด ๋ฐ๋ณต๋๊ณ ๊ทธ ์ค ์ด์๋จ์ ๊ฐ์ฒด๋ Old ์์ญ์ผ๋ก ์ด๋ํ๋ค.

4. Card Table
Old Generation ๊ฐ Young Generation ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ 512๋ฐ์ดํธ ์ฒญํฌ์ด๋ค. ์นด๋ ํ ์ด๋ธ์ Old Generation ์ ๊ฐ์ฒด๊ฐ Young Generation ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋๋ง๋ค ์ ๋ณด๊ฐ ํ์๋๋ฉฐ Young Generation ์ GC ๋ฅผ ์คํํ ๋, Card Table ์ Old Generation ์ ๊ฐ์ฒด๋ฅผ ํ์ํด ์ ์ฒด Old Area ๋ฅผ ํ์ํ์ง ์๋ ์ฅ์ ์ด ์๋ค.

5. Major GC ์ ๋ํ์ ๋์ ๋ฐฉ์ : mark-and-sweep-compaction
๋์ฒด์ ์ผ๋ก GC ๋ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์๋ณํ๊ณ , ์๋ณํ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค. ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก Old GC ์ mark-and-sweep-compact algorithm ์ด๋ค. mark-and-sweep-compact algorithm ์ ํฌ๊ฒ 3๊ฐ์ง ๊ณผ์ ์ ๊ฑฐ์ณ ๋์ํ๋ค.
- marking : GC ๊ฐ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ณํ๋ ๋จ๊ณ
- deletion with compacting : ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ์ฌ ์ฐธ์กฐ ๊ฐ์ฒด๋ฅผ ์์ถํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋จ๊ณ
Step 1: Marking

GC ๊ฐ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ณํ๋ ๋จ๊ณ์ด๋ค. Java GC ๋ ์ ํจํ ์ฐธ์กฐ๋ ๊ฐ์ฒด๋ฅผ ์ ํจํ๋ค๊ณ ํ๋ณํ๋ค. ์ด ๋ ๊ฐ์ฅ ์ต์ด์ ์ฐธ์กฐ๋ฅผ root set ์ด๋ผ ์ ์ํ๋ฉฐ, root set ์ ๊ธฐ์ค์ ์๋์ ๊ฐ๋ค.
- Java ๋ฉ์๋ ์คํ ์์ ์ฌ์ฉํ๋ ์ง์ญ ๋ณ์์ ํ๋ผ๋ฏธํฐ๋ค์ ์ํ ์ฐธ์กฐ (Java ์คํ)
- JNI(Java Native Interface)์ ์ํด ์์ฑ๋ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ (๋ค์ดํฐ๋ธ ์คํ)
- ๋ฉ์๋ ์์ญ์ ์ ์ ๋ณ์์ ์ํ ์ฐธ์กฐ

Step 2 : deletion with compacting

์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ์ฌ ์ฐธ์กฐ๋ ๊ฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ์ฌ์ ๊ณต๊ฐ์ ๋จ๊ธฐ๊ณ ์์ถ ๊ณผ์ ์ ํตํด ์ฑ๋ฅ์ ํฅ์ํ๋ ๊ณผ์ ์ ๋งํ๋ค.
6. Major GC ์๋ ๋ค์ํ ๋ฐฉ์์ด ์๋ค.
๋ฐฉ๊ธ ์ธ๊ธํ๋ mark-and-sweep-compact algorithm ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ Major GC ๋ Serial GC, Parallel GC ์ด๋ค. ๋ค๋ฅธ GC ๋ํ ์ด ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ GC ๋ ์กด์ฌํ๊ณ Java11 ์ default Major GC ์ธ G1 GC ์ ๊ฐ์ด ๋ค๋ฅธ ์ปจ์ ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋์ํ๋ Major GC ๊ฐ ์กด์ฌํ๋ค. ์ด ๋ถ๋ถ์ ๊น๊ฒ ํ๋ฉด ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒ์ ์๋ ค๊ณ ํ๊ธฐ ๋ณด๋ค๋ ์ปจ์ ์ ๋น๊ตํ๊ณ ํ์ํ ๋ด์ฉ๋ค์ ํ๋์ฉ ์์๊ฐ๋ณด๋ ์์ผ๋ก ํ์ตํ๋ ค๊ณ ํ๋ค.
Reference
'๐ programming-language > java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ํผ์ฌ๋ ํจํด(Facade Pattern) (0) | 2024.07.08 |
|---|---|
| ์ปค๋งจ๋ ํจํด(command pattern) (0) | 2024.07.08 |
| ์ฑ ์ ์ฐ์ ํจํด (chain of responsibility pattern) (1) | 2024.07.05 |
| ์ฑ๊ธํค ํจํด(singleton pattern) (0) | 2024.07.03 |
| ์ ๋ฐ ์ฐ์ฐ์๋ BigDecimal ์ ์ฌ์ฉํ์ (0) | 2024.04.24 |
