[JVM] Garbage Collector
1. GC(Garbage Collector)๋ ?
Java Application์ ํ์์ ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ฒด๋ฅผ ์ป๋๋ค.
Application์ด ์์ฑ๋ ๋ก์ง์ ๋ฐ๋ผ ์งํ๋๋ฉฐ ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ํด์ ์๋ก์ด ๊ฐ์ฒด๋ค์ ์ ๋ณด๊ฐ ์ฌ๋ผ๊ฐ ๊ฒ์ด๊ณ , Application์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋
๊ฐ์ฒด์ ๋ํ ์ ๋ณด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ์์ ๊ฒ์ด๋ค.
์ ์ฅ ๊ณต๊ฐ์ ๋ฌดํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฐ๋ ์ฐจ๊ฒ ๋๋ค๋ฉด OOM Error(OutOfMemoryErrors)๋ก ์ธํด์ Application์ด ๋น์ ์์ ์ผ๋ก ์ข
๋ฃ๊ฐ ๋ ๊ฒ์ด๋ค.
Application์์ ๋์ด์ ์ฌ์ฉํ์ง ์์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ Garbage๋ผ๊ณ ํ๋ค.
GC๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ์ค์ธ ๊ฐ์ฒด์ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์๋ณํด Garbage๋ฅผ ์๋์ผ๋ก ๊ฒฐ์ ํ๊ณ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ์ํด ์ญํ ์ ์ํํ๋ค.
Java์ GC๋ ์๋ ํ๋ก์ธ์ค์ด๊ธฐ ๋๋ฌธ์ Java ๊ฐ๋ฐ์๋ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒด๋ฅผ ๋ช
์์ ์ผ๋ก ํด์ ํด์ค์ผ ํ๋ ๋ถ๋ด์ด ์๋ค.
๋ง์ฝ ๋ช
์์ ์ผ๋ก ํด์ ํด์ฃผ๊ณ ์ถ๋ค๋ฉด
Student student = new Student();
student.setName("์ฐ์์ฐ");
student = null;
System.gc();
์์ ์ฝ๋์ฒ๋ผ ๊ฐ์ฒด์ null๋ก ์ง์ ํ๊ฑฐ๋ System.gc()๋ฅผ ์ฌ์ฉํด GC๋ฅผ ํธ์ถํ ์ ์๋ค. (System.gc()๋ฅผ ํธ์ถํ๋๊ฑด ์์คํ ์ ์ฑ๋ฅ์ ๋งค์ฐ ํฐ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก ์ ๋๋ก ์ฌ์ฉํ๋ฉด ์๋๋ค.)
2. GC์ ๊ตฌ์กฐ์ ์ฒ๋ฆฌ๊ณผ์
Reachability
Java GC๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง์ธ์ง ํ๋ณํ๊ธฐ ์ํด์ reachability๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ๋ค. ์ด๋ค ๊ฐ์ฒด์ ์ ํจํ ์ฐธ์กฐ๊ฐ ์์ผ๋ฉด โreachableโ๋ก ์์ผ๋ฉด โunreachableโ๋ก ๊ตฌ๋ณํ๊ณ , unreachable ๊ฐ์ฒด๋ฅผ ๊ฐ๋น์ง๋ก ๊ฐ์ฃผํด GC๋ฅผ ์ํํ๋ค.
GC์ ๊ตฌ์กฐ
GC๋ ๋๊ฐ์ง ๊ฐ์ค ํ์ ๋ง๋ค์ด์ก๋ค.
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ ์ํ(unreachable)๊ฐ ๋๋ค.
- ์ค๋๋ ๊ฐ์ฒด์์ ์ ์ ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ์์ฃผ ์ ๊ฒ ์กด์ฌํ๋ค.
์ด๋ฌํ ๊ฐ์ค์ weak generational hypothesis๋ผ ํ๋ค. ์ด ๊ฐ์ค์ ์ฅ์ ์ ์ต๋ํ ์ด๋ฆฌ๊ธฐ ์ํด์ HotSpot JVM์์๋
ํฌ๊ฒ Young Generation, Old Generation 2๊ฐ๋ก ๋ฌผ๋ฆฌ์ ๊ณต๊ฐ์ ๋๋์๋ค.
Hotspot JVM
Hotspot JVM์ ๋ฏธ๊ตญ์ Longview Technologies LLC๋ผ๋ ํ์ฌ์์ 1999๋ ์ ์ฒ์ ๋ฐํ๋ JVM์ด๋ค. ์ดํ ์ด ํ์ฌ๋ ๊ฐ์ ํด SUN์ ์ํด ์ธ์๋์ด 1.3๋ฒ์ ๋ถํฐ SUN์ ๊ธฐ๋ณธ์ ์ธ JVM์ด ๋์๋ค. Hotspot JVM์ ํ์ฌ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ JVM ์ค์ ํ๋๋ก Windows, Linux, Solaris๋ ๋ฌผ๋ก Mac OS์ ๊ธฐํ UJnix OS์๋ ํ์ฌ๊ฐ ๊ฐ๋ฅํ๋ค. HP Unix์์๋ Hotspot JVM์ ์ ๊ณตํ๊ณ ์๊ณ , ์ฌ์ง์ด Oracle์ ์ค์นํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์น๋์ด ๊ตฌ๋๋๋ JVM ์กฐ์ฐจ Hotspot JVM์ด๋ค. ๋ฐ๋ผ์ย Sun, Oracle, HP, Windows, Linux, MacOS์์ ์ ๊ณตํ๋ JVM์ Hotspot JVM์ผ๋ก ๋ช ๋ช ํ๊ณ IBM์์ ์ ๊ณตํ๋ JVM์ IBM JVM์ด๋ผ ๋ถ๋ฅด๊ธฐ๋ย ํ๋ค.
Young Generation๊ณผ Old Generation
- Young Generation : ์๋กญ๊ฒ ์์ฑํ ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ์ฌ๊ธฐ์ ์์นํ๋ค. ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋ง์ ์์ ๊ฐ์ฒด๋ค์ด ์ด ์์ญ์์ ์์ฑ๋์๋ค๊ฐ ์ฌ๋ผ์ง๋ค.
Young Generation์์ GC๊ฐ ๋์ํ๋ ๊ฒ์ Minor GC๋ผ๊ณ ํ๋ค. - Old Generation : ์ ๊ทผ ๋ถ๊ฐ๋ฅํ ์ํ๊ฐ๋์ง ์์ Young Generation์์ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์์นํ๋ค. Young Generation๋ณด๋ค GC๊ฐ ์ ๊ฒ ๋ฐ์ํ๋ค.
Old Generation์์ GC๊ฐ ๋์ํ๋ ๊ฒ์ Major GC๋ผ๊ณ ํ๋ค.
Young Generation
Young Generation์ ๋ค์ Survivor ์์ญ๊ณผ Eden ์์ญ์ผ๋ก ๋๋๋ค.
- Eden์์ญ์ ๊ฐ์ฒด๊ฐ Heap์ ์ต์ด๋ก ํ ๋น๋๋ ์ฅ์์ด๋ค.
- Survivor ์์ญ์ Eden ์์ญ์์ ๋์ด์จ ๊ฐ์ฒด๋ค์ด ๋จธ๋ฌด๋ฅด๋ ์ฅ์์ด๋ค.
-
Survivor ์์ญ์ ๋ ๊ฐ์ ์์ญ(Survivor1, Survivor2)์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- Young Generation์ ์ฒ๋ฆฌ ์ ์ฐจ
- Eden ์์ญ์ด ๊ฝ ์ฐจ๊ฒ ๋๋ฉด ๊ฐ์ฒด์ ์ฐธ์กฐ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
- ์ฐธ์กฐ๊ฐ ๋์ด์๋ ๊ฐ์ฒด๋ผ๋ฉด Survivor ์์ญ์ผ๋ก ๋๊ธฐ๊ณ ์ฐธ์กฐ๊ฐ ๋์ด์์ง ์์ Garbage๋ผ๋ฉด ๊ทธ๋ฅ ๋จ๊ฒจ ๋๋๋ค.
- ์ฐธ์กฐ๋์ด ์๋ ๋ชจ๋ ๊ฐ์ฒด๊ฐ Survivor ์์ญ์ผ๋ก ๋์ด๊ฐ๋ฉด Eden ์์ญ์ ๋ชจ๋ ์ฒญ์ํ๋ค.
- Survivor ์์ญ๋ ๊ฝ ์ฐจ๊ฒ ๋๋ฉดMinor GC๊ฐ ์๋ํ๋ค.
- ํ ์ชฝ์ Survivor๊ฐ ๊ฐ๋ ์ฐจ๋ฉด ์ฐธ์กฐ๋ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ Survivor์ ์ฎ๊ธฐ๊ณ GC๊ฐ ์๋ํ๋ค.
- ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ๊ฐ ๋ ๊ฐ์ฒด๋ค์ ๋์ด๊ฐ ์ฌ๋ผ๊ฐ๋ค.
(๋ฐ๋ผ์ Survovir์ ์์ญ ์ค ํ ๊ณณ์ ๋ฐ๋์ ๋น์ด์๋ ์ํ์ด๋ค.) - ์ด๋ฌํ ๊ณผ์ ์ ๋ฐ๋ณตํด Survivor ์์ญ์์ ์ค๋ ์ด์๋จ์ ์ผ์ ๋์ด ์ด์์ด ๋ ๊ฐ์ฒด๋ค์ Old Generation์ผ๋ก ์ด๋๋๋ค.
์๋์ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ์ ํ์ธํด ๋ณด์.
Hbump-the-pointer, TLABs(Thread-Local Allocation Buffers) ์ค๋ช
HotSpot VM์์๋ ๋ณด๋ค ๋น ๋ฅธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ํด์ ๋ ๊ฐ์ง ๊ธฐ์ ์ ์ฌ์ฉํ๋ค. ํ๋๋ bump-the-pointer๋ผ๋ ๊ธฐ์ ์ด๋ฉฐ, ๋ค๋ฅธ ํ๋๋ TLABs(Thread-Local Allocation Buffers)๋ผ๋ ๊ธฐ์ ์ด๋ค.
bump-the-pointer๋ Eden ์์ญ์ ํ ๋น๋ ๋ง์ง๋ง ๊ฐ์ฒด๋ฅผ ์ถ์ ํ๋ค. ๋ง์ง๋ง ๊ฐ์ฒด๋ Eden ์์ญ์ ๋งจ ์(top)์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ค์์ ์์ฑ๋๋ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด, ํด๋น ๊ฐ์ฒด์ ํฌ๊ธฐ๊ฐ Eden ์์ญ์ ๋ฃ๊ธฐ ์ ๋นํ์ง๋ง ํ์ธํ๋ค. ๋ง์ฝ ํด๋น ๊ฐ์ฒด์ ํฌ๊ธฐ๊ฐ ์ ๋นํ๋ค๊ณ ํ์ ๋๋ฉด Eden ์์ญ์ ๋ฃ๊ฒ ๋๊ณ , ์๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ๋งจ ์์ ์๊ฒ ๋๋ค. ๋ฐ๋ผ์, ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ง์ง๋ง์ ์ถ๊ฐ๋ ๊ฐ์ฒด๋ง ์ ๊ฒํ๋ฉด ๋๋ฏ๋ก ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ด๋ฃจ์ด์ง๋ค.
๊ทธ๋ฌ๋ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์ ๊ณ ๋ คํ๋ฉด ์ด์ผ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ค. Thread-Safeํ๊ธฐ ์ํด์ ๋ง์ฝ ์ฌ๋ฌ ์ค๋ ๋์์ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ฅผ Eden ์์ญ์ ์ ์ฅํ๋ ค๋ฉด ๋ฝ(lock)์ด ๋ฐ์ํ ์ ๋ฐ์ ์๊ณ , lock-contention ๋๋ฌธ์ ์ฑ๋ฅ์ ๋งค์ฐ ๋จ์ด์ง๊ฒ ๋ ๊ฒ์ด๋ค. HotSpot VM์์ ์ด๋ฅผ ํด๊ฒฐํ ๊ฒ์ด TLABs์ด๋ค.
๊ฐ๊ฐ์ ์ค๋ ๋๊ฐ ๊ฐ๊ฐ์ ๋ชซ์ ํด๋นํ๋ Eden ์์ญ์ ์์ ๋ฉ์ด๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์๋๋ก ํ๋ ๊ฒ์ด๋ค. ๊ฐ ์ฐ๋ ๋์๋ ์๊ธฐ๊ฐ ๊ฐ๊ณ ์๋ TLAB์๋ง ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์, bump-the-pointer๋ผ๋ ๊ธฐ์ ์ ์ฌ์ฉํ๋๋ผ๋ ์๋ฌด๋ฐ ๋ฝ์ด ์์ด ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
Old Generation
Young Generation์์ ์ค๋ ์ด์๋จ์ ์ผ์ Age์ด์์ด ๋ ๊ฐ์ฒด๋ Promotion์ด ๋ฐ์ํด Old Generation ์์ญ์ผ๋ก ์ด๋ํ๋ค.
Old Generation ์์ญ์ด ์ฑ์์ง๋ค๊ฐ ๊ฐ๋์ฐจ๊ฒ ๋๋ฉด Young Generation ์์ ์ฒ๋ผ GC๊ฐ ๋์ํ๋ค.
3. GC ๋ฐฉ์
Old Generation์์ GC์ ๋ฐฉ์์ ๋ฐ๋ผ ์ฒ๋ฆฌ ์ ์ฐจ๊ฐ ๋ฌ๋ผ์ง๋ค.
JVM์ ๋ฒ์ ์ ๋ฐ๋ผ ์ฌ๋ฌ๊ฐ์ง GC ๋ฐฉ์์ด ์ถ๊ฐ๋๊ณ ๋ฐ์ ๋์๋ค. ๋ฒ์ ๋ณ๋ก ์ง์ํ๋ GC๋ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ค.
Serial GC
Young ์์ญ์์์ GC๋ ์์์ ์ค๋ช
ํ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ Old ์์ญ์์์ GC๋ Mark-sweep-compact๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
์๊ณ ๋ฆฌ์ฆ์ ๋จ๊ณ๋ณ๋ก ์ค๋ช
ํ๋ฉด
- Old ์์ญ์ ์ด์์๋ ๊ฐ์ฒด๋ฅผ ์๋ณ(Mark)
- Heap์ ์๋ถ๋ถ๋ถํฐ ํ์ธํ์ฌ ์ด์ ์๋ ๊ฐ์ฒด๋ง ๋จ๊ธด๋ค(Sweep)
- ๊ฐ ๊ฐ์ฒด๋ค์ด ์ฐ์๋๊ฒ ์์ด๋๋ก Heap์ ๊ฐ์ฅ ์๋ถ๋ถ๋ถํฐ ์ฑ์์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ๊ณผ ๊ฐ์ฒด๊ฐ ์๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ค.(Compact)
Serial GC๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ์ CPU ์ฝ์ด ๊ฐ์๊ฐ ์ ์ ๋ ์ ํฉํ ๋ฐฉ์์ด๋ค.
๋ฐ๋ผ์ ์ด์ ์๋ฒ์์ ์ ๋ ์ฌ์ฉํด์๋ ์ ๋๋ ๋ฐฉ์์ด Serial GC์ด๋ค. Serial GC๋ ๋ฐ์คํฌํฑ์ CPU ์ฝ์ด๊ฐ ํ๋๋ง ์์ ๋ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ Serial GC๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ด ๋ง์ด ๋จ์ด์ง๋ค.
Parallel GC
Parallel GC๋ Serial GC์ ๊ธฐ๋ณธ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋ค.
Serial GC๋ ์ฒ๋ฆฌํ๋ ์ฐ๋ ๋๊ฐ ํ๋์ธ ๊ฒ์ ๋นํด Parallel GC๋ Miner GC, Major GC ๋ชจ๋ ๋ฉํฐ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํด ์ฒ๋ฆฌํ๋ค.
CMS GC
- ์ด๊ธฐ Initial Mark ๋จ๊ณ์์ ์ฐธ์กฐ ์ํ์ธ ๊ฐ์ฒด๋ฅผ ์งง์ ์๊ฐ์ Marking ํ๋ค.
- Concurrent Mark ๋จ๊ณ์์ ๋ฐฉ๊ธ ์ด์์๋ค๊ณ ํ์ธํ ๊ฐ์ฒด์์ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด์ ํ์ธํ๋ค.
(์ด ๋จ๊ณ์ ํน์ง์ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์คํ ์ค์ธ ์ํ์์ ๋์์ ์งํ๋๋ค๋ ์ ์ด๋ค.) - Remark ๋จ๊ณ์์๋ Concurrent Mark ๋จ๊ฒ์์ ์๋ก ์ถ๊ฐ๋๊ฑฐ๋ ์ฐธ์กฐ๊ฐ ๋๊ธด ๊ฐ์ฒด๋ฅผ ํ์ธํ๋ค.
- Concurrent Sweep ๋จ๊ณ์์๋ Garbage๋ฅผ ์ ๋ฆฌํ๋ ์์ ์ ์คํํ๋ค.
CMS GC๋ stop-the-world ์๊ฐ์ด ๋งค์ฐ ์งง๋ค๋ ์ฅ์ ์ด ์์ด ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ต ์๋๊ฐ ๋งค์ฐ ์ค์ํ ๋ ์ฌ์ฉํ๋ค.
๋ฐ๋ฉด์ ๋จ์ ์ผ๋ก๋
- ๋ค๋ฅธ GC ๋ฐฉ์๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ์ CPU๋ฅผ ๋ ๋ง์ด ์ฌ์ฉ
- ๋ฉ๋ชจ๋ฆฌ ํํธํ ๊ฐ ์๋ค.
G1 GC
์ฌ์ง์์ ๋ณด์ด๋ฏ์ด G1 GC๋ ๋ฐ๋ํ์ ๊ฐ ์์ญ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ GC๋ฅผ ์คํํ๋ค.
๊ธฐ์กด์ Young, Old ์์ญ์ ๊ฐ๋
๊ณผ ๋ค๋ฅธ Resion์ด๋ผ๋ ๊ฐ๋
์ ๋์
ํ๋ค.
์์ญ์ด ๊ฝ ์ฐจ๊ฒ ๋๋ฉด ๋ค๋ฅธ ์์ญ์์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ GC๋ฅผ ์คํํ๋ค. ์ง๊ธ๊น์ง ์ค๋ช
ํ๋ Young ์์ญ์์ Old ์์ญ์ผ๋ก ์ด๋ํ๋ ๋จ๊ณ๊ฐ ์ฌ๋ผ์ง GC ๋ฐฉ์์ด๋ผ๊ณ ์ดํดํ๋ฉด ๋๋ค.
- CMS์ ๋น์ทํ ๋ฐฉ์์ผ๋ก ๋์ ์์
- Heap์ ์ ์ญ์ ์ผ๋ก Marking
- ๊ฐ์ฅ ๋ง์ ๊ณต๊ฐ์ด ์๋ ๊ณณ๋ถํฐ ๋ฉ๋ชจ๋ฆฌ ํ์๋ฅผ ์งํ
CMS GC์ CPU ๋ฆฌ์์ค ๋ฐ ๋ฉ๋ชจ๋ฆฌ ํํธํ์ ๋จ์ ์ ํด๊ฒฐํ์๋ค.
์ฐธ๊ณ ํ ๋ด์ฉ์ ์ถ์ฒ
https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html https://d2.naver.com/helloworld/1329 https://www.eginnovations.com/blog/what-is-garbage-collection-java/