Garbage Collection
์๋ฐ ํ๋ซํผ์ด ์ฒ์ ์ถ์๋์ ๋ ๊ฐ๋น์ง ์์ง(GC)์ ์๋นํ ๋ฐ๊ฐ์ ์๋ค. ์ธ์ด ์์ค์์ ์๋์ ์ผ๋ก ์์ง๊ธฐ ์๋์ ์ ์ดํ์ง ๋ชปํ๊ฒ ๋ง๋ค์๋ค๋ ์ฌ์ค์ด ์๋ ค์ง๋ฉด์ ์ฌ๋ก ์ ๋ ๋๋น ์ก๋ค. ํ์ง๋ง ์ธ์์ด ์ง๋๋ฉด์ ์ด์ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์ปดํ์ผ๋ฌ๋ ๋ฐํ์์ ์์ญ์ด๋ผ๊ณ ๋ณด๋ ์๊ฐ์ด ์ง๋ฐฐ์ ์ด๋ค.
Garbage Collection์ ๋ ๊ฐ์ง ๊ธฐ๋ณธ ์์น
๋ชจ๋ GC ๊ตฌํ์ฒด๋ ๋น์ฐํ ๋ง์ด์ง๋ง ๋ค์ ๋ ๊ฐ์ง ๊ธฐ๋ณธ ์์น์ ์ค์ํด์ผ ํ๋ค.
์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋์ ๋ชจ๋ ๊ฐ๋น์ง๋ฅผ ์์งํด์ผ ํ๋ค
์ด์ ์๋ ๊ฐ์ฒด๋ ์ ๋๋ก ์์งํด์ ์ ๋๋ค.
Java Garbage Collection ์ ์ฉ ๋ฒ์
๊ธฐ๋ณธ์ ์ผ๋ก JVM์ ๋ฉ๋ชจ๋ฆฌ๋ ์ด 5๊ฐ์ง ์์ญ(class, stack, heap, native method, PC)์ผ๋ก ๋๋๋๋ฐ, GC๋ ํ ๋ฉ๋ชจ๋ฆฌ๋ง ๋ค๋ฃฌ๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ GC์ ๋์์ด ๋๋ค.
๊ฐ์ฒด๊ฐ NULL์ธ ๊ฒฝ์ฐ
๋ธ๋ญ ์คํ ์ข ๋ฃ ํ, ๋ธ๋ญ ์์์ ์์ฑ๋ ๊ฐ์ฒด
๋ถ๋ชจ ๊ฐ์ฒด๊ฐ NULL์ธ ๊ฒฝ์ฐ, ํฌํจํ๋ ์์ ๊ฐ์ฒด
System.gc()
? ๊ฐ๋ ๋ช ์์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ํด์ ํ ๋ ํด๋น ๊ฐ์ฒด๋ฅผ null๋ก ์ง์ ํ๊ฑฐ๋ System.gc()๋ฅผ ํธ์ถํ๊ธฐ๋ ํ๋ค. null๋ก ์ง์ ํ๋ ๊ฑด ํฐ ๋ฌธ์ ๋ ์ ๋์ง๋ง, System.gc()๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ผ์น๋ฏ๋ก ์ ๋๋ก ์ฌ์ฉํด์ ์ ๋๋ค. System.gc()๋ ์ ์ ์ค์ธ ์ธ๋ชจ์๋ ๊ฐ์ฒด๋ฅผ ํด์ ์์ผ์ฃผ๋ static system์ ๋ฉ์๋์ธ๋ฐ, System.gc()๋ฅผ ์ง์ ํธ์ถํ๋ฉด ์๋๊ฐ 750~850ms๋ก ์๋ ํธ์ถ๋๋ gc๋ณด๋ค 5,000๋ฐฐ ์ด์์ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค๊ณ ํ๋ค.
์ด์ ์๋ฐ ๊ฐ๋น์ง ์์ง์ ๊ธฐ์ด ์ด๋ก ์ ์๊ฐํ๊ณ , ์๋ฐ ํ๋ซํผ์์ ๊ฐ๋น์ง ์์ง์ ์์ ํ ์ดํด/์ ์ดํ๊ธฐ๊ฐ ์ด๋ ค์ด ์ด์ ๋ฅผ ๋งํด๋ณด์. ๋ ํซ์คํ์ด ๋ฐํ์์ ๊ฐ์ฒด๋ฅผ ํ์ ๋ํ๋ด๋ ๋ฐฉ๋ฒ๊ณผ ๊ทธ ๊ธฐ๋ณธ ํน์ฑ์ ์์๋ณด์.
๋์ผ๋ก๋ ํซ์คํ์์ ๊ฐ์ฅ ๋จ์ํ ์์ฉ ์์ง๊ธฐ์ธ ๋ณ๋ ฌ ์์ง๊ธฐ๋ฅผ ์๊ฐํ๊ณ ๋ค์ํ ์ํฌ๋ก๋์์์ ์ฐ์์๋ฅผ ์์๋ณด์.
Garbage Collection์ ๋์ ๋ฐฉ์
์ธ๋ถ์ ์ธ ๋์ ๋ฐฉ์์ ๋ค๋ฅด์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์คํ๋ ๋๋ ๋ค์์ ๋์ ๋ฐฉ์๋ค์ ๋ฐ๋ฅธ๋ค.
Stop The World
๊ฐ๋ฐ์ง๋ฅผ ์์งํ๋ ๋์์ JVM์ด ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ๋ฉ์ถ๋ค. stop-the-world๊ฐ ๋ฐ์ํ๋ฉด GC๋ฅผ ์คํํ๋ ์ค๋ ๋๋ฅผ ์ ์ธํ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ค๋ ๋๊ฐ ์ค๋จ๋๋ค. GC ์์ ์ ์๋ฃํ ์ดํ์์ผ ์ค๋จํ๋ ์์ ์ ๋ค์ ์์ํ๋ค. ์ด๋ค GC ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋๋ผ๋ stop-the-world๋ ๋ฐ์ํ๋ค. ๋๋ถ๋ถ GC ํ๋์ด๋ ์ด stop-the-world ์๊ฐ์ ์ค์ด๋ ๊ฒ์ด๋ค.
Mark and Sweep
์ด์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ณ(Mark)
ํ์ ์ ๋ถ๋ถ๋ถํฐ ํ์ธํด์ ์ด์ ์๋ ๊ฒ๋ง ๋จ๊น(Sweep)
Compaction(์์ฐฉ)
์ด์๋จ์ ๊ฐ์ฒด๋ค์ GC ์ฌ์ดํด ๋ง์ง๋ง์ ์ฐ์๋ ๋จ์ผ ์์ญ์ผ๋ก(๋๋ถ๋ถ ๊ทธ ์์ญ์ ์ฒซ ๋ถ๋ถ๋ถํฐ) ๋ฐฐ์ด๋๋ฉฐ, ๊ฐ์ฒด ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ ๋น ๊ณต๊ฐ์ ์์์ ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ์๋ค. ์ด ๊ณผ์ ์ ํตํด ๋ฉ๋ชจ๋ฆฌ ๋จํธํ(memory fragmentation)์ ๋ฐฉ์งํ ์ ์๋ค.
Weak Geneartional Hypothesis: ์ฝํ ์ธ๋๋ณ ๊ฐ์ค
์ํํธ์จ์ด ์์คํ ์ ๋ฐํ์ ์์ฉ์ ๊ด์ฐฐํ ๊ฒฐ๊ณผ ์๊ฒ ๋ ๊ฒฝํ ์ง์์ด๋ค.
JVM ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ด๋ก ์ ๊ทผ๊ฐ์ด ๋๋ค.
๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ์์ฃผ ์งง์ ์๊ฐ๋ง ์ด์์๊ณ , ๋๋จธ์ง๋ ๊ธฐ๋ ์๋ช ์ด ํจ์ฌ ๊ธธ๋ค.
์ค๋๋ ๊ฐ์ฒด์์ ์ ์ ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ์์ฃผ ์ ๊ฒ ์กด์ฌํ๋ค.
์ด ๋ฒ์น์ ๊ฒฐ๋ก ์ ๊ฐ๋น์ง๋ฅผ ์์งํ๋ ํ์ ๋นจ๋ฆฌ ์ฃฝ๋ ๊ฐ์ฒด๋ค์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์์งํ ์ ์๊ฒ ์ค๊ณ๋์ด์ผ ํ๊ณ , ์ฅ์ ๊ฐ์ฒด์ ๋จ๋ช ๊ฐ์ฒด๋ฅผ ์์ ํ ๋ผ์ด ๋๋ ๊ฒ ์ข๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ํซ์คํ(JVM)์ ๋ช ๊ฐ์ง ๋ฉ์ปค๋์ฆ์ ์์ฉํด์ ์ ๊ฐ์ค์ ํ์ฉํ๋ค.
ํฌ๊ฒ 2๊ฐ๋ก ๋ฌผ๋ฆฌ์ ๊ณต๊ฐ์ ๋๋๋ค.
Young ์์ญ(Yong Generation ์์ญ): ์๋กญ๊ฒ ์์ฑํ ๊ฐ์ฒด์ ๋๋ถ๋ถ์ด ์ฌ๊ธฐ์ ์์นํ๋ค. ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅ ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋ง์ ๊ฐ์ฒด๊ฐ Young ์์ญ์ ์์ฑ๋์๋ค๊ฐ ์ฌ๋ผ์ง๋ค. ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๋ Minor GC๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํ๋ค.
Old ์์ญ(Old Generation ์์ญ): ์ ๊ทผ ๋ถ๊ฐ๋ฅ ์ํ๋ก ๋์ง ์์ Young ์์ญ์์ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์ฌ๊ธฐ๋ก ๋ณต์ฌ๋๋ค. ๋๋ถ๋ถ Young ์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋นํ๋ฉฐ, ํฌ๊ธฐ๊ฐ ํฐ ๋งํผ Young ์์ญ๋ณด๋ค GC๋ ์ ๊ฒ ๋ฐ์ํ๋ค. ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง ๋ Major GC(ํน์ Full GC)๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํ๋ค.
์ด ๋, Old ์์ญ์ด Young ์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋น๋๋ ์ด์ ๋ Young ์์ญ์ ์๋ช ์ด ์งง์ ๊ฐ์ฒด๋ค์ ํฐ ๊ณต๊ฐ์ ํ์๋ก ํ์ง ์์ผ๋ฉฐ ํฐ ๊ฐ์ฒด๋ค์ Young ์์ญ์ด ์๋๋ผ ๋ฐ๋ก Old ์์ญ์ ํ ๋น๋๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์ฒด๋ง๋ค generational count๋ฅผ ์ผ๋ค: ๊ฐ์ฒด๊ฐ ์ง๊ธ๊น์ง ๋ฌด์ฌ ํต๊ณผํ ๊ฐ๋น์ง ์์ง ํ์
Hotspot JVM?
๋ฏธ๊ตญ์ Longview Technologies LLC๋ผ๋ ํ์ฌ์์ ์ฒ์ ๋ฐํ๋ JVM์ด๋ค. 1999๋ ์ ์ฒ์ ๋ฐํ๋์์ผ๋ฉฐ, ๋นํด์ฐ๋์ SUN์ ์ธ์๋์ด 1.3 ๋ฒ์ ๋ถํฐ SUN์ ๊ธฐ๋ณธ JVM์ผ๋ก ์๋ฆฌ ์ก๊ฒ ๋์๋ค. Hotspot JVM์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ JVM ์ค ํ๋๋ก์จ Windows, Linux, Max, Unix ์ด์์ฒด์ ์๋ ๊ตฌ๋์ด ๊ฐ๋ฅํ๋ค. Hotspot JVM๊ณผ ์๋์ฐ๋งฅ์ ์ด๋ฃจ๋ JVM์ IBM JVM์ด ์๋ค. WebSphere ๋ฑ IBM ์๋ฃจ์ ์์๋ IBM JVM์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ์ง๋ง, ๊ทธ ์ธ ๋๋ถ๋ถ์ ์๋ฃจ์ ์์๋ Hotspot JVM์ ์ฌ์ฉํ๋ค.
Card Table
Old ์์ญ์ ์๋ ๊ฐ์ฒด๊ฐ Young ์์ญ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ๋ ์์ฃผ ์ ์ง๋ง ์กด์ฌํ ๊ฒ์ด๋ค. ์ด ๋ Young ์์ญ์์ Minor GC๊ฐ ์คํ๋ ๋ ๋ชจ๋ Old ์์ญ์ ์กด์ฌํ๋ ๊ฐ์ฒด๋ฅผ ๊ฒ์ฌํด์ ์ฐธ์กฐ๋์ง ์๋ Young ์์ญ์ ๊ฐ์ฒด๋ฅผ ์ฐพ๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ค.
๋ฐ๋ผ์ ํซ์คํ์ ์นด๋ ํ ์ด๋ธ์ด๋ผ๋ ์๋ฃ ๊ตฌ์กฐ์ Old ๊ฐ์ฒด๊ฐ Young ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ค. ์นด๋ ํ ์ด๋ธ์ JVM์ด ๊ด๋ฆฌํ๋ ๋ฐ์ดํธ ๋ฐฐ์ด๋ก, ๊ฐ ์์๋ Old ์์ญ์ 512๋ฐ์ดํธ ์์ญ์ ๊ฐ๋ฆฌํจ๋ค.
์นด๋ ํ ์ด๋ธ์๋ OId ์์ญ์ ์๋ ๊ฐ์ฒด๊ฐ Young ์์ญ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋๋ง๋ค ์ ๋ณด๊ฐ ํ์๋๋ค. Young ์์ญ์ GC๋ฅผ ์คํํ ๋๋ Old ์์์ ์๋ ๋ชจ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ํ์ธํ์ง ์๊ณ , ์ด ์นด๋ํ ์ด๋ธ๋ง ๋ค์ ธ์ GC ๋์์ธ์ง ์๋ณํ๋ค.
Young ์์ญ์ ๊ตฌ์ฑ
young ์์ญ์ 3๊ฐ์ ์์ญ์ผ๋ก ๋๋๋ค.
Eden ์์ญ
Survivor ์์ญ 2๊ฐ
์ด ์์ญ์ ์ฒ๋ฆฌ ์ ์ฐจ๋ ๋ค์๊ณผ ๊ฐ๋ค. (Minor GC)
์๋ก ์์ฑํ ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ Eden ์์ญ์ ์์นํ๋ค.
Eden ์์ญ์์ GC๊ฐ ํ ๋ฒ ๋ฐ์ํ ํ ์ด์๋จ์ ๊ฐ์ฒด๋ Survivor ์์ญ ์ค ํ๋๋ก ์ด๋๋๋ค.
Eden ์์ญ์์ GC๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฏธ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ Survivor ์์ญ(์์ Survivor ์์ญ)์ผ๋ก ๊ฐ์ฒด๊ฐ ๊ณ์ ์์ธ๋ค.
ํ๋์ Survivor ์์ญ์ด ๊ฐ๋ ์ฐจ๊ฒ ๋๋ฉด ๊ทธ ์ค์์ ์ด์๋จ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ Survivor ์์ญ์ผ๋ก ์ด๋ํ๋ค. (๋ฐฉ์ถ) ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ ์ฐฌ Survivor ์์ญ์ ์๋ฌด ๋ฐ์ดํฐ๋ ์๋ ์ํ๋ก ๋๋ค.
์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค๊ฐ ๊ณ์ํด์ ์ด์๋จ์ ๊ฐ์ฒด๋ Old ์์ญ์ผ๋ก ์ด๋(Promotion)ํ๊ฒ ๋๋ค.
Minor GC์์ ๊ฐ์ฒด๊ฐ ์ด์๋จ์ ํ์๋ฅผ ์๋ฏธํ๋ age๋ฅผ Object Header์ ๊ฐ์ฒด์ ์์กดํ์๋ก ๊ธฐ๋กํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด age๋ฅผ ๋ณด๊ณ Promotion ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.

์ด ์ ์ฐจ๋ฅผ ํ์ธํด๋ณด๋ฉด Survivor ์์ญ ์ค ํ๋๋ ํญ์ ๋ฐ๋์ ๋น์ด ์๋ ์ํ์ด๋ค. ๋ง์ฝ ๋ Survivor ์์ญ์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ค๋ฉด ์์คํ ์ด ์ ์์ ์ธ ์ํฉ์ด ์๋๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ด ๋ ํซ์คํ์์ ์ด ์ฒ๋ฆฌ ์ ์ฐจ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ํ๊ธฐ ์ํ ๋ ๊ฐ์ง ๊ธฐ์ ์ด ์ฌ์ฉ๋๋ค.
bump-the-pointer
bump-the-pointer๋ Eden ์์ญ์ ํ ๋น๋ ๋ง์ง๋ง ๊ฐ์ฒด๋ฅผ ์ถ์ ํ๋ค. ๋ง์ง๋ง ๊ฐ์ฒด๋ Eden ์์ญ์ ๋งจ ์์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ค์์ ์์ฑ๋๋ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด ํด๋น ๊ฐ์ฒด์ ํฌ๊ธฐ๊ฐ Eden ์์ญ์ ๋ฃ๊ธฐ ์ ๋นํ์ง๋ง ํ์ธํ๋ค. ๋ฐ๋ผ์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ง์ง๋ง์ ์ถ๊ฐ๋ ๊ฐ์ฒด๋ง ์ ๊ฒํ๋ฉด ๋๋ฏ๋ก ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ด๋ฃจ์ด์ง๋ค.
TLABs(Thread-Local Allocation Buffers)
๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์ด๋จ๊น? ๋ง์ฝ ์ฌ๋ฌ ์ค๋ ๋์์ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ฅผ Eden ์์ญ์ ์ ์ฅํ๋ ค๋ฉด, Eden ์์ญ์ ์ ๊ทผํ ๋๋ง๋ค ๋ฝ์ด ๋ฐ์ํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ฑ๋ฅ์ด ๋งค์ฐ ๋จ์ด์ง๊ฒ ๋๋ค. ์ด๋ฅผ ํซ์คํ์์ TLABs๋ฅผ ์ด์ฉํด ํด๊ฒฐํ๋ค.
ํซ์คํ์ ์๋ด์ ์ฌ๋ฌ ๋ฒํผ๋ก ๋๋์ด์ ๊ฐ๊ฐ์ ์ค๋ ๋๊ฐ Eden ์์ญ์ ์์ ๋ฉ์ด๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ํ๋ค. ๊ฐ ์ค๋ ๋์๋ ์๊ธฐ๊ฐ ๊ฐ๊ณ ์๋ TLAB์๋ง ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก ๋ฝ ์์ด ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๊ฐ๋ฅํ๋ค.
ํซ์คํ์ TLAB ํฌ๊ธฐ๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํด์ ํ ์ค๋ ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฒญ๋๊ฒ ์๋ชจํ๊ณ ์์ผ๋ฉด ๋ ํฐ TLAB๋ฅผ ๊ฑด๋ค์ค๋ค.



VisualVM์์ Visual GC ํ๋ฌ๊ทธ์ธ์ ๋ค์ด๋ฐ์ผ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณต๊ฐ์ ์์ฒ๋ผ ๋ณผ ์ ์๋ค.
๊ฒฐ๋ก
Eden ์์ญ์ ์ต์ด๋ก ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๊ณ , Survivor ์์ญ์ ํตํด์ Old ์์ญ์ผ๋ก ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์ด๋ํ๋ค!
Old ์์ญ์ ๋ํ GC (Major GC)
Old ์์ญ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด GC๋ฅผ ์คํํ๋ค. Young ์์ญ์ ์ผ๋ฐ์ ์ผ๋ก Old ์์ญ๋ณด๋ค ํฌ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ GC๊ฐ ๋ณดํต 0.5~1์ด ์ฌ์ด์ ๋๋๋ค. ๋ฐ๋ผ์ Minor GC๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฐ ์ํฅ์ ์ฃผ์ง ์๋๋ค. ํ์ง๋ง Old ์์ญ์ Young ์์ญ๋ณด๋ค ํฌ๋ฉฐ Young ์์ญ์ ์ฐธ์กฐํ ์๋ ์๋ค. ๋ฐ๋ผ์ Major GC๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆฌ๊ณ , 10๋ฐฐ ์ด์์ ์๊ฐ์ ์ฌ์ฉํ๋ค.
์ด ๋ GC ๋ฐฉ์์ ๋ฐ๋ผ์ ์ฒ๋ฆฌ ์ ์ฐจ๊ฐ ๋ฌ๋ผ์ง๋ค.
Serial GC
์ด์ ์๋ฒ์์ ์ ๋ ์ฌ์ฉํ๋ฉด ์ ๋๋ ๋ฐฉ์์ด๋ค. ๋ฐ์คํฌํฑ์ GPU ์ฝ์ด๊ฐ ํ๋๋ง ์์ ๋ ์ฌ์ฉํ๊ธฐ ์ํ ๋ฐฉ์์ด๋ค.
Parallel GC
ParallelOld GC
Concurrent Mark & Sweep GC(์ดํ CMS)
G1(Garbage First) GC
Java 9 ๋ฒ์ ๋ถํฐ ๊ธฐ๋ณธ ๊ฐ๋น์ง ์ปฌ๋ ํฐ
Serial GC
GC ๋ฐฉ์
Young ์์ญ: ์์์ ์ค๋ช ํ ๋ฐฉ์ ์ฌ์ฉ
Old ์์ญ: Mark-Sweep-Compact ์๊ณ ๋ฆฌ์ฆ
์ ์ ๋ฉ๋ชจ๋ฆฌ, CPU ์ฝ์ด ๊ฐ์ ์ ์ ๋ ์ ํฉ
java -XX:+UseSerialGC -jar Application.java
๋ณ๋ ฌ ์์ง๊ธฐ
๋ณ๋ ฌ ์์ง๊ธฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ค๋ ๋๋ฅผ ๋ชจ๋ ์ค๋จ์ํจ ๋ค์(STW), ๊ฐ์ฉ CPU ์ฝ์ด๋ฅผ ์ด๋์ํด ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์งํ๋ค.
Parallel GC (Throughput GC)
Serial GC์ ๊ธฐ๋ณธ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋ค. Serial GC๋ GC๋ฅผ ์ฒ๋ฆฌํ๋ ์ค๋ ๋๊ฐ ํ๋์ง๋ง, Parallel GC๋ GC๋ฅผ ์ฒ๋ฆฌํ๋ ์ค๋ ๋๊ฐ ์ฌ๋ฌ ๊ฐ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก Serial GC๋ณด๋ค ๋น ๋ฅด๊ฒ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ค. ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถฉ๋ถํ๊ณ ์ฝ์ด์ ๊ฐ์๊ฐ ๋ง์ ๋ ์ ๋ฆฌํ๋ค. ์ต์ ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต๋ ์ง์ฐ ์๊ฐ, GC๋ฅผ ์ํํ ์ฐ๋ ๋์ ๊ฐฏ์ ๋ฑ์ ์ค์ ํ ์ ์๋ค.
java -XX:+UseParallelGC -jar Application.java // ์ฌ์ฉํ ์ฐ๋ ๋์ ๊ฐฏ์ -XX:ParallelGCThreads=<N> // ์ต๋ ์ง์ฐ ์๊ฐ -XX:MaxGCPauseMillis=<N>
Parallel GC๊ฐ GC์ ์ค๋ฒํค๋๋ฅผ ์๋นํ ์ค์ฌ์ฃผ์๊ณ , Java8๊น์ง ๊ธฐ๋ณธ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ก ์ฌ์ฉ๋์๋ค. ๊ทธ๋ผ์๋ Application์ด ๋ฉ์ถ๋ ๊ฒ์ ํผํ ์ ์์๊ณ , ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ด ๋ ๋ฑ์ฅํ๊ฒ ๋์๋ค.
Parallel Old GC
์ Parallel GC์ ๋น๊ตํ์ฌ Old ์์ญ์ GC ์๊ณ ๋ฆฌ์ฆ๋ง ๋ค๋ฅด๋ค. ์ด ๋ฐฉ์์ Mark-Summary-Compaction ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค. Summary๋จ๊ณ๋ ์์ GC๋ฅผ ์ํํ ์์ญ์ ๋ํด์ ๋ณ๋๋ก ์ด์์๋ ๊ฐ์ฒด๋ฅผ ์๋ณํ๋ค๋ ์ ์์ Sweep ๋จ๊ณ์ ๋ค๋ฅด๋ค.
GMC(Concurrent Mark Sweep) GC
CMS GC๋ Parallel GC์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋๋ฅผ ์ด์ฉํ๋ค. ํ์ง๋ง ๊ธฐ์กด์ Serial/Parallel GC์๋ ๋ค๋ฅด๊ฒ Mark Sweep ์๊ณ ๋ฆฌ์ฆ์ Concurrentํ๊ฒ ์ํํ๋ค.

CMS GC๊ฐ ์ํ๋ ๋๋ ์์์ด GC๋ฅผ ์ํด์๋ ์ฌ์ฉ๋๋ฏ๋ก ์๋ต์ด ๋๋ ค์ง ์ ์์ง๋ง ์๋ต์ด ๋ฉ์ถ์ง๋ ์๊ฒ ๋๋ค. ํ์ง๋ง ๋ค๋ฅธ GC ๋ฐฉ์๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ, CPU๋ฅผ ๋ ๋ง์ด ํ์๋ก ํ๊ณ Compaction ๋จ๊ณ๋ฅผ ์ํํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ฅ๊ธฐ์ ์ผ๋ก ์ด์๋๋ค๊ฐ ์กฐ๊ฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ค์ด ๋ง์(memory fragmentation) compation ๋จ๊ณ๊ฐ ์ํ๋๋ฉด Stop The World ์๊ฐ์ด ๊ธธ์ด์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
// deprecated in java9 and finally dropped in java14
java -XX:+UseConcMarkSweepGC -jar Application.java
G1(Garbage First) GC
์๋ฐ ์์ง๊ธฐ๋ ์ด ๋๊น์ง ๋ณธ ๊ฒ์ฒ๋ผ ํ์ Young/Old ์์ญ์ผ๋ก ๋๋ ์ ๊ด๋ฆฌํ๋๋ฐ, G1์ ํ์ ๋ฐฐ์นํ๋ ๋ฐฉ์ ์์ฒด๊ฐ ์์ ํ ๋ค๋ฅด๋ค. G1 GC๋ Eden ์์ญ์ ํ ๋นํ๊ณ , Survivor๋ก ์นดํผํ๋ ๊ณผ์ ์ ์ฌ์ฉํ์ง๋ง ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋๋์ง ์๋๋ค. ๋์ Region์ด๋ผ๋ ๊ฐ๋ ์ ๋์ ํด์ Heap์ ๊ท ๋ฑํ๊ฒ ์ฌ๋ฌ ๊ฐ์ ์ง์ญ์ผ๋ก ๋๋๊ณ , ๊ฐ ์ง์ญ์ ์ญํ ๊ณผ ํจ๊ป ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ตฌ๋ถํด์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค.

Region์ Humonogous์ Available/Unused๋ผ๋ 2๊ฐ์ง ์ญํ ์ด ์ถ๊ฐ๋์๋ค.
Humonogous: Region ํฌ๊ธฐ์ 50%๋ฅผ ์ด๊ณผํ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ Region
Available/Unused: ์ฌ์ฉ๋์ง ์๋ Region
G1 GC์ ํต์ฌ์ Heap์ ๋์ผํ ํฌ๊ธฐ์ Region์ผ๋ก ๋๋๊ณ , ๊ฐ๋น์ง๊ฐ ๋ง์ region์ ๋ํด ์ฐ์ ์ ์ผ๋ก GC๋ฅผ ์ํํ๋ ๊ฒ์ด๋ค.
G1 GC๋ ๋ค๋ฅธ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก 2๊ฐ์ง GC๋ก ๋๋์ด ์ํ๋๋ค.
Minor GC
ํ ์ง์ญ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค๊ฐ ํด๋น ์ง์ญ์ด ๊ฝ ์ฐจ๋ฉด ๋ค๋ฅธ ์ง์ญ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ , Minor GC๊ฐ ์ํ๋๋ค. ์ด ๋ ๊ฐ๋น์ง๊ฐ ๊ฐ์ฅ ๋ง์ ์ง์ญ์ ์ฐพ์์ Mark and Sweep์ ์ํํ๋ค.
Eden ์ง์ญ์์ GC๊ฐ ์ํ๋๋ฉด Mark and Sweep์ ์ํ ํ ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ์ง์ญ์ผ๋ก ์ด๋ํ๋ค. ๋ณต์ ๋๋ ์ง์ญ์ด Avaiable/Unused ์ง์ญ์ด๋ฉด ํด๋น ์ง์ญ์ ์ด์ Survivor ์์ญ์ด ๋๊ณ , Eden ์์ญ์ Available/Unused ์ง์ญ์ด ๋๋ค.
Major GC(Full GC)
์์คํ ์ด ๊ณ์ ์ด์๋๋ค๊ฐ ๊ฐ์ฒด๊ฐ ๋๋ฌด ๋ง์ ๋น ๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์์ ๋ Major GC๊ฐ ์คํ๋๋ค.
๊ธฐ์กด์ ๋ค๋ฅธ GC ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ Heap ์์ญ์์ GC๊ฐ ์ํ๋์ด ์ฒ๋ฆฌ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ์ง๋ง, G1 GC๋ ์ด๋ ์์ญ์ ๊ฐ๋น์ง๊ฐ ๋ง์ ์ง๋ฅผ ์๊ณ ์๊ธฐ ๋๋ฌธ์ GC๋ฅผ ์ํํ ์ง์ญ์ ์กฐํฉํด์ GC๋ฅผ ์ํํ๋ค. ๊ฒ๋ค๊ฐ ์ด๋ฌํ ์์ ์ด Concurrentํ๊ฒ ์ํ๋๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ฐ๋ ์ต์ํํ ์ ์๋ค.
Concurrent: ์ ํ๋ฆฌ์ผ์ด์ ์ค๋ ๋์ ๋์์ ์คํ๋๋ค๋ ๊ฒ
G1 GC๋ ๋ค๋ฅธ GC ๋ฐฉ์์ ๋นํด ์ฆ๊ฒ ํธ์ถ๋๊ฒ ์ง๋ง, ์์ ๊ท๋ชจ์ ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ ์์ + Concurrentํ๊ฒ ์ํ๋๋ฏ๋ก ์ง์ฐ์ด ํฌ์ง ์๊ณ , ๊ฐ๋น์ง๊ฐ ๋ง์ ์ง์ญ์ ์๊ณ ์์ด ํด๋น ์ง์ญ์ ๋ํด ์ ๋ฆฌ๋ฅผ ํ๋ฏ๋ก ํจ์ฌ ํจ์จ์ ์ด๋ค.
java -XX:+UseG1GC -jar Application.java
G1 GC๋ GC ๋ฐฉ์ ์ค์ ๊ฐ์ฅ ์ฒ๋ฆฌ ์๋๊ฐ ๋น ๋ฅด๊ณ ํฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ๋ฉํฐ ํ๋ก๋ ์ค ๊ธฐ๋ฐ์ผ๋ก ์ด์๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ๊ณ ์๋์๋ค. ๋ฐ๋ผ์ Java9๋ถํฐ ๊ธฐ๋ณธ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ก ์ฌ์ฉ๋๊ฒ ๋์๋ค.
์ฐธ๊ณ
https://github.com/GimunLee/tech-refrigerator/blob/master/Language/JAVA/Garbage%20Collection.md#garbage-collection
https://d2.naver.com/helloworld/1329
https://mangkyu.tistory.com/118
https://wookoa.tistory.com/169
https://cyk0825.tistory.com/88?category=1124085
http://www.yes24.com/Product/Goods/72161685
Last updated