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()๋ฅผ ํธ์ถํ๋๊ฑด ์์คํ ์ ์ฑ๋ฅ์ ๋งค์ฐ ํฐ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก ์ ๋๋ก ์ฌ์ฉํ๋ฉด ์๋๋ค.)
Java GC๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง์ธ์ง ํ๋ณํ๊ธฐ ์ํด์ reachability๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ๋ค. ์ด๋ค ๊ฐ์ฒด์ ์ ํจํ ์ฐธ์กฐ๊ฐ ์์ผ๋ฉด โreachableโ๋ก ์์ผ๋ฉด โunreachableโ๋ก ๊ตฌ๋ณํ๊ณ , unreachable ๊ฐ์ฒด๋ฅผ ๊ฐ๋น์ง๋ก ๊ฐ์ฃผํด GC๋ฅผ ์ํํ๋ค.
GC๋ ๋๊ฐ์ง ๊ฐ์ค ํ์ ๋ง๋ค์ด์ก๋ค.
์ด๋ฌํ ๊ฐ์ค์ weak generational hypothesis๋ผ ํ๋ค. ์ด ๊ฐ์ค์ ์ฅ์ ์ ์ต๋ํ ์ด๋ฆฌ๊ธฐ ์ํด์ HotSpot JVM์์๋
ํฌ๊ฒ Young Generation, Old Generation 2๊ฐ๋ก ๋ฌผ๋ฆฌ์ ๊ณต๊ฐ์ ๋๋์๋ค.
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์ ๋ค์ Survivor ์์ญ๊ณผ Eden ์์ญ์ผ๋ก ๋๋๋ค.
Survivor ์์ญ์ ๋ ๊ฐ์ ์์ญ(Survivor1, Survivor2)์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์๋์ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ์ ํ์ธํด ๋ณด์.
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๋ผ๋ ๊ธฐ์ ์ ์ฌ์ฉํ๋๋ผ๋ ์๋ฌด๋ฐ ๋ฝ์ด ์์ด ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
Young Generation์์ ์ค๋ ์ด์๋จ์ ์ผ์ Age์ด์์ด ๋ ๊ฐ์ฒด๋ Promotion์ด ๋ฐ์ํด Old Generation ์์ญ์ผ๋ก ์ด๋ํ๋ค.
Old Generation ์์ญ์ด ์ฑ์์ง๋ค๊ฐ ๊ฐ๋์ฐจ๊ฒ ๋๋ฉด Young Generation ์์ ์ฒ๋ผ GC๊ฐ ๋์ํ๋ค.
Old Generation์์ GC์ ๋ฐฉ์์ ๋ฐ๋ผ ์ฒ๋ฆฌ ์ ์ฐจ๊ฐ ๋ฌ๋ผ์ง๋ค.
JVM์ ๋ฒ์ ์ ๋ฐ๋ผ ์ฌ๋ฌ๊ฐ์ง GC ๋ฐฉ์์ด ์ถ๊ฐ๋๊ณ ๋ฐ์ ๋์๋ค. ๋ฒ์ ๋ณ๋ก ์ง์ํ๋ GC๋ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ค.
Young ์์ญ์์์ GC๋ ์์์ ์ค๋ช
ํ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ Old ์์ญ์์์ GC๋ Mark-sweep-compact๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
์๊ณ ๋ฆฌ์ฆ์ ๋จ๊ณ๋ณ๋ก ์ค๋ช
ํ๋ฉด
Serial GC๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ์ CPU ์ฝ์ด ๊ฐ์๊ฐ ์ ์ ๋ ์ ํฉํ ๋ฐฉ์์ด๋ค.
๋ฐ๋ผ์ ์ด์ ์๋ฒ์์ ์ ๋ ์ฌ์ฉํด์๋ ์ ๋๋ ๋ฐฉ์์ด Serial GC์ด๋ค. Serial GC๋ ๋ฐ์คํฌํฑ์ CPU ์ฝ์ด๊ฐ ํ๋๋ง ์์ ๋ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ Serial GC๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ด ๋ง์ด ๋จ์ด์ง๋ค.
Parallel GC๋ Serial GC์ ๊ธฐ๋ณธ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋ค.
Serial GC๋ ์ฒ๋ฆฌํ๋ ์ฐ๋ ๋๊ฐ ํ๋์ธ ๊ฒ์ ๋นํด Parallel GC๋ Miner GC, Major GC ๋ชจ๋ ๋ฉํฐ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํด ์ฒ๋ฆฌํ๋ค.
CMS GC๋ stop-the-world ์๊ฐ์ด ๋งค์ฐ ์งง๋ค๋ ์ฅ์ ์ด ์์ด ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ต ์๋๊ฐ ๋งค์ฐ ์ค์ํ ๋ ์ฌ์ฉํ๋ค.
๋ฐ๋ฉด์ ๋จ์ ์ผ๋ก๋
์ฌ์ง์์ ๋ณด์ด๋ฏ์ด G1 GC๋ ๋ฐ๋ํ์ ๊ฐ ์์ญ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ GC๋ฅผ ์คํํ๋ค.
๊ธฐ์กด์ Young, Old ์์ญ์ ๊ฐ๋
๊ณผ ๋ค๋ฅธ Resion์ด๋ผ๋ ๊ฐ๋
์ ๋์
ํ๋ค.
์์ญ์ด ๊ฝ ์ฐจ๊ฒ ๋๋ฉด ๋ค๋ฅธ ์์ญ์์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ GC๋ฅผ ์คํํ๋ค. ์ง๊ธ๊น์ง ์ค๋ช
ํ๋ Young ์์ญ์์ Old ์์ญ์ผ๋ก ์ด๋ํ๋ ๋จ๊ณ๊ฐ ์ฌ๋ผ์ง GC ๋ฐฉ์์ด๋ผ๊ณ ์ดํดํ๋ฉด ๋๋ค.
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/