Java๋ C, C++ ์ธ์ด์ ๋ฌ๋ฆฌ ๊ฐ๋ฐ์๊ฐ ๋ช
์์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ํด์ ํ ํ์๊ฐ ์์ต๋๋ค.
Java์์๋ JVM(Java Virtual Machine)์ด ๊ตฌ์ฑ๋ JRE(Java Runtime Environment)๊ฐ ์ ๊ณต๋ฉ๋๋ค.
JVM์์ Garbage Collection์ ์ํํ์ฌ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ํ๋ ์์
์ ํ๊ฒ ๋ฉ๋๋ค.
๐ก stop-the-world
GC๋ฅผ ์คํํ๊ธฐ ์ํด JVM์ด ์ ํ๋ฆฌ์ผ์ด์
์คํ์ ๋ฉ์ถ๋ ๊ฒ์
๋๋ค.
์ด๋ค GC ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋๋ผ๋ ์ด๋ ๋ฐ์ํ๊ฒ ๋๋๋ฐ, ๋๊ฐ์ ๊ฒฝ์ฐ GC ํ๋์ ์ด ์๊ฐ์ ์ค์ด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ GC์ ๋์์ด ๋ฉ๋๋ค.
- ๊ฐ์ฒด๊ฐ Null์ธ ๊ฒฝ์ฐ
- ๋ธ๋ญ ์คํ ์ข ๋ฃ ํ, ๋ธ๋ญ ์์์ ์์ฑ๋ ๊ฐ์ฒด
- ๋ถ๋ชจ ๊ฐ์ฒด๊ฐ Null์ธ ๊ฒฝ์ฐ, ํฌํจํ๋ ์์ ๊ฐ์ฒด
๐ก GC ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ณผ์
1. Marking: ํ๋ก์ธ์ค๋ ๋งํน์ ํธ์ถํ์ฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ์ฉ๋๋์ง ์๋์ง ์ฐพ์๋
๋๋ค. ๋ชจ๋ ์ค๋ธ์ ํธ๊ฐ ์ค์บ๋๊ธฐ ๋๋ฌธ์ ๋ง์ ์๊ฐ์ด ์๋ชจ๋ฉ๋๋ค.
2. Mormal Deletion: ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ Allocator๋ ๋ฐํ๋์ด ๋น์ด์ง ๋ธ๋ญ์ ์ฐธ์กฐ ์์น๋ฅผ ์ ์ฅํด ๋์๋ค๊ฐ ์๋ก์ด ์ค๋ธ์ ํธ๊ฐ ์ ์ธ๋๋ฉด ํ ๋น๋๋๋ก ํฉ๋๋ค.
3. Compacting: ํผํฌ๋จผ์ค ํฅ์์ ์ํด ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๊ณ ๋จ์ ๊ฐ์ฒด๋ค์ ๋ฌถ์์ผ๋ก์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ ๋ ์ฝ๊ฒ ๋น ๋ฅด๊ฒ ์งํ๋ ์ ์๋๋ก ํฉ๋๋ค.
์ GC ๋ฉ๋ชจ๋ฆฌ ํด์ ๊ณผ์ ๊ณผ ๊ฐ์ด ๋ชจ๋ ๊ฐ์ฒด๋ฅผ Mark & Compack ํ๋ JVM์ ๋นํจ์จ์ ์
๋๋ค.
์๋ ๊ทธ๋ํ์์ Y์ถ์ ํ ๋น๋ ๋ฐ์ดํธ์ ์, X์ถ์ ๋ฐ์ดํธ๊ฐ ํ ๋น๋ ๋์ ์๊ฐ์ ๋ํ๋
๋๋ค.
์ ๊ทธ๋ํ์ ๊ฐ์ด ์๊ฐ์ด ๊ฐ์๋ก ์ ์ ๊ฐ์ฒด๋ง ๋จ๋ ๋ค๋ ๊ฒ์ด ์ฝํ ์ธ๋ ๊ฐ์ค์
๋๋ค.
์ ๊ท๋ก ์์ฑํ ๊ฐ์ฒด์ ๋๋ถ๋ถ์ ๊ธ๋ฐฉ ์ฌ์ฉํ์ง ์๋ ์ํ๊ฐ ๋๊ณ , ์ค๋๋ ๊ฐ์ฒด์์ ์ ๊ท ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ๋งค์ฐ ์ ๊ฒ ์กด์ฌํ๋ค๋ ๊ฐ์ค์
๋๋ค.
์ด ๊ฐ์ค์ ๊ธฐ๋ฐํ์ฌ ์๋ฐ๋ Young ์์ญ๊ณผ Old ์์ญ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ถํ ํ์ฌ
์ ๊ท๋ก ์์ฑ๋๋ ๊ฐ์ฒด๋ Young ์์ญ์, ์ค๋ซ๋์ ์ด์๋จ์ ๊ฐ์ฒด๋ Old ์์ญ์ ๋ณด๊ดํฉ๋๋ค.
JVM์ ๋ฉ๋ชจ๋ฆฌ๋ ์ด class, stack, heap, native method, PC, 5๊ฐ์ง ์์ญ์ผ๋ก ๋๋๋๋ฐ, GC๋ ํ ๋ฉ๋ชจ๋ฆฌ๋ง ๋ค๋ฃน๋๋ค.
- Young Generation ์์ญ
์๋กญ๊ฒ ์์ฑํ ๊ฐ์ฒด๊ฐ ์์นํ๋ ๊ณณ์ผ๋ก ๋ง์ ๊ฐ์ฒด๊ฐ ์์ฑ๋์๋ค๊ฐ ์ฌ๋ผ์ง๋ ์์ญ์ ๋๋ค.
์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง ๋ Minor GC๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํฉ๋๋ค. - Old Generation ์์ญ
์ ๊ทผ ๋ถ๊ฐ๋ฅ ์ํ๋ก ๋์ง ์๊ณ Young ์์ญ์์ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์ฌ๊ธฐ๋ก ๋ณต์ฌ๋ฉ๋๋ค.
Young ์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋นํ๋ฉฐ ํฌ๊ธฐ๊ฐ ํฐ ๋งํผ GC๋ ์ ๊ฒ ๋ฐ์ํฉ๋๋ค.
์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง ๋ Major GC ๋๋ Full GC๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํฉ๋๋ค. - Permanent ์์ญ
Methods Area๋ผ๊ณ ๋ ํ๋ฉฐ, JVM์ด ํด๋์ค๋ค๊ณผ ๋ฉ์๋๋ค์ ์ค๋ช ํ๊ธฐ ์ํด ํ์ํ ๋ฉํ ๋ฐ์ดํฐ๋ค์ ํฌํจํ๋ ์์ญ์ ๋๋ค.
JDK8๋ถํฐ๋ Meta Space๋ก ๊ต์ฒด๋ฉ๋๋ค.
โ
Generational Gabage Collection ๊ณผ์
1. ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ค์ด์ค๋ฉด Eden Space์ ํ ๋นํฉ๋๋ค.
2. Eden Space๊ฐ ๊ฐ๋์ฐจ๋ฉด Minor Garbage Collection์ด ์์๋ฉ๋๋ค.
3. ์ฐธ์กฐ์ค์ธ ๊ฐ์ฒด๋ Survivor1 ์์ญ์ผ๋ก, ๋น ์ฐธ์กฐ ๊ฐ์ฒด๋ Eden Spacerk Clear๋ ๋ ๋ฐํ๋ฉ๋๋ค.
4. ๋ค์ Minor GC ๋ ์ฐธ์กฐ ๊ฐ์ฒด๋ Survivor2 ์์ญ์ผ๋ก ์ด๋ํฉ๋๋ค. ์ฐธ์กฐ ๊ฐ์ฒด๋ค์ด ๋ชจ๋ Survivor2 ์์ญ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ฉด Eden Space์ Survivor1 ์์ญ์ Clear ๋ฉ๋๋ค. ์ฃผ์ํ ์ ์ ๋ค๋ฅธ age๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ค์ ํ ๊ณต๊ฐ์ ๊ฐ์ง๊ฒ ๋์๋ค๋ ๊ฒ์
๋๋ค.
5. ๋ค์ Minor GC ์์๋ ์ฐธ์กฐ ๊ฐ์ฒด๋ค์ด Survivor1 ์์ญ์ผ๋ก ์ด๋ํฉ๋๋ค. ์ด๋ ๊ฒ ๊ณ์ ๋ ๊ณต๊ฐ์ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์ฌ์ฉํฉ๋๋ค.
6. Minor GC ํ Survivor ์์ญ์ด ๊ฐ๋์ฐจ๊ฑฐ๋ ๋๋ ๊ฐ์ฒด๋ค์ด ์ผ์ ํ age threshold๋ฅผ ๋๊ฒ ๋๋ฉด Old ์์ญ์ผ๋ก Promition ๋ฉ๋๋ค.
7. Major Gsms Old Generation์์ ์คํ ํ Clear ๋๊ณ ๊ณต๊ฐ์ด Compact ๋ฉ๋๋ค.
๊ฐ์ฅ ๋จ์ํ ๋ฐฉ์์ GC๋ก ์ฑ๊ธ ์ค๋ ๋๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋งํผ stop-the-world ์๊ฐ์ด ๊น๋๋ค.
Mark & Sweep & Compact ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํฉ๋๋ค.
Java 8์ default GC๋ก, Young ์์ญ์ GC๋ฅผ ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Serial GC๋ณด๋ค stop-the-world ๊ฐ ์งง์ต๋๋ค.
Old Generation ์์ญ์์๋ง Full GC(๊ณต๊ฐ ์ฌํ๋ณด ๋ฐ ์กฐ๊ฐ ๋ชจ์) ์ํํฉ๋๋ค.
Old ์์ญ๊น์ง ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก -XX:+ParallelGCThreads=n ์ต์
์ ํตํด ๋ฉํฐ ์ค๋ ๋ ๊ฐ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
Stop The World๋ก Java Application์ด ๋ฉ์ถ๋ ํ์์ ์ค์ด๊ณ ์ ๋ง๋ GC๋ก,
4 ๋จ๊ณ๋ก ๋๋์ด Reacable ํ ๊ฐ์ฒด๋ฅผ ํ๋ฒ์ ์ฐพ์ง ์๊ณ ๋๋ ์ ์ฐพ๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
- Initial Mark: GC Root๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ง ๋งํนํฉ๋๋ค. (stop-the-world ๋ฐ์)
- Concurrent Mark: ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ, ์ง์์ ์ผ๋ก ๋งํนํฉ๋๋ค. (stop-the-world ์์ด ์ํ)
- Remark: concurrent mark ๊ณผ์ ์์ ๋ณ๊ฒฝ๋ ์ฌํญ์ด ์๋์ง ๋ค์ ํ๋ฒ ๋งํนํ๋ฉฐ ํ์ ํ๋ ๊ณผ์ ์ ์งํํฉ๋๋ค. (stop-the-world ๋ฐ์)
- Concurrent Sweep: ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ ๊ณผ์ ์ ์งํํฉ๋๋ค. (stop-the-world ์์ด ์ํ)
CMS๋ Old Generation์ ์กฐ๊ฐ ๋ชจ์(Compaction)์ ํ์ง ์์ผ๋ฏ๋ก Full GC ์๊ฐ์ด ๊ธธ์ด์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
Java 9 ์ด์์ ๋ฒ์ ์์ default GC๋ก, ํ์ฌ GC ์ค stop-the-world์ ์๊ฐ์ด ์ ์ผ ์งง์ต๋๋ค.
CMS GC ๋ฅผ ๊ฐ์ ํ์ฌ ๋ง๋ GC๋ก ๋ค๋ฅธ GC์ ๋ค๋ฅด๊ฒ ์ ์ฒด ํ ๊ณต๊ฐ์ ์ฒด์คํ์ฒ๋ผ Region
์ด๋ผ๋ ์์ญ์ผ๋ก ๋๋์ด ๊ด๋ฆฌํฉ๋๋ค.
์ ์ฒด Heap์ ๋ํด์ ํ์ํ์ง ์๊ณ ๋ถ๋ถ์ ์ผ๋ก Region ๋จ์๋ก ํ์ํ์ฌ, ๊ฐ๊ฐ์ Region์๋ง GC๊ฐ ๋ฐ์ํฉ๋๋ค.
Young๊ณผ Old ์์ญ์ ๊ตฌ๋ถ์ด ์์ผ๋ฉฐ, ์์ญ์ ์ฐธ์กฐ๋ฅผ ๊ด๋ฆฌํ ๋ชฉ์ ์ผ๋ก Remember Set์ ๋ง๋ค์ด ์ฌ์ฉํฉ๋๋ค. (์ ์ฒด ํ์ 5% ๋ฏธ๋ง์ ํฌ๊ธฐ)
ํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง ๋ฉํฐ ํ๋ก์ธ์ค ์์คํ
์ ์ ํฉํฉ๋๋ค.
๐ก G1 GC ๋์ ๊ณผ์
Young ์์ญ(Eden, Survivor)์์๋ Young GC๊ฐ ์ํ๋๋ฉฐ Eden, Survivor ์์ญ ์ด๋
์ฎ๊ธฐ๋ฉด์ ๋น์์ง ์์ญ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋น ์์ญ์ผ๋ก ๋๋๋ฆผ
โ
Full GC ์ํ ๋จ๊ณ
Initial Mark -> Root Region Scan -> Concurrent Mark -> Remark -> Cleanup -> Copy
- Initial Mark
Old ์ง์ญ์ ์กด์ฌํ๋ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐํ๋ Survivor ์์ญ ํ์
STW ๋ฐ์
- Root Region Scan
์ด์ ๋จ๊ณ์์ ์ฐพ์ ์์ญ์ ๋ํ GC ๋์ ๊ฐ์ฒด ์ค์บ
- Concurrent Mark
์ ์ฒด ํ ์์ญ ์ค์บ
GC ๋์ ๊ฐ์ฒด๊ฐ ์๋ ์์ญ์ ์ดํ ๋จ๊ณ์์ ์ ์ธ
- Remark
STW๊ฐ ๋ฐ์ํ๋ฉฐ ์ต์ข
์ผ๋ก GC ๋์์์ ์ ์ธํ ๊ฐ์ฒด ์๋ณ
- Cleanup
STW๊ฐ ๋ฐ์ํ๋ฉฐ ์ ๊ฑฐํ ๊ฐ์ฒด๊ฐ ๊ฐ์ฅ ๋ง์ ์ง์ญ์์ GC ์ํ
์๋ฃ ํ, ์์ ํ ๋น์์ง ์์ญ์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด Freelist์ ์ถ๊ฐ
- Copy
GC ๋์์ด์์ง๋ง Cleanup ๋จ๊ณ์์ ์์ ํ ๋น์์ง์ง ์์ ์ง์ญ์ ๋จ์ ๊ฐ์ฒด๋ฅผ ์๋ก์ด ์์ญ์ ๋ณต์ฌํ์ฌ ์กฐ๊ฐ ๋ชจ์(Compaction) ์์
์ํ