๐ฑ Garbage Collection(๊ฐ๋น์ง ์ปฌ๋ ์ )์ด๋?
c๋ c++ ๊ฐ์ unmanaged language๋ free() ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ํด์ ํด์ผ ํ๋ค.
ํ์ง๋ง java์์๋ JVM์ ๊ฐ๋น์ง์ปฌ๋ ํฐ๊ฐ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์์ ์ ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ํด์ ํ ํ์๊ฐ ์๋ค.
์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ฃผ๋ ์ด์ ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํจ์ด๋ค!!
๋ฉ๋ชจ๋ฆฌ๋ ํ์ ์ ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ํ์ ์๋ ๋ถ๋ถ์ ๊ผญ ํด์ ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
๐ค ๊ฐ๋น์ง ์ปฌ๋ ํฐ vs ๊ฐ๋น์ง ์ปฌ๋ ์
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ : ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ ์์คํ ๋๋ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑ ์์์ด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ๊ฑฐํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ๋ ์ญํ ์ ํ๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ์ : ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ์ ์ค ํ๋๋ก, ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์ํด ์ํ๋๋ ํ๋ก์ธ์ค๋ฅผ ์๋ฏธํ๋ค.
์ฆ, ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํ๋ก์ธ์ค ์์ฒด๋ฅผ ์๋ฏธํ๊ณ , ์ค์ ์ญํ ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ํ๊ฒ ๋๋ค!
๐ค ๊ทธ๋ผ ๊ฐ๋น์ง๊ฐ ๋ฌด์์ผ๊น?
Heap ์์ญ์์ ๋์ ์ผ๋ก ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ ์ค ํ์ ์๊ฒ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๊ฐ๋น์ง(Garbage)๋ผ๊ณ ํ๋ค.
Student std = new Student("๊น๋ฏผ์");
std.goSchool();
// ๊ฐ๋น์ง ๋ฐ์
std = new Student("์ด์ํฌ");
์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด, ๊น๋ฏผ์๋ผ๋ ์ด๋ฆ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด์ std๊ฐ ๊น๋ฏผ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋์๋ค.
ํ์ง๋ง, ๋ฉ์๋ ์คํ ํ ์ด์ํฌ๋ผ๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ฉด์ ๊น๋ฏผ์๋ผ๋ ๊ฐ์ฒด๋ ๋์ด์ ์ฌ์ฉํ ํ์๊ฐ ์์ด์ก๋ค.
์ฌ๊ธฐ์ ๊ฐ๋น์ง๊ฐ ๋ฐ์ํ๋ค๊ณ ํ๋ค!
๐ฑ JVM์ Heap ๋ฉ๋ชจ๋ฆฌ ์์ญ
JVM์ Heap ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ํด๋น ์ด๋ฏธ์ง์ฒ๋ผ ์๊ฒผ์๋ค.
ํ์ง๋ง Java8๋ถํฐ Perm์์ญ์ด ์ ๊ฑฐ๋์๊ณ , ์๋์ ๊ฐ์ ํ๋ก์ฐ๋ก ์คํ๋๋ค.
JVM์ Heap ์์ญ์ 2๊ฐ์ง ์ ์ ๋ก ์ค๊ณ๋์๋ค๊ณ ํ๋ค.
- ๋๋ถ๋ถ ๊ฐ์ฒด๋ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ ์ํ๊ฐ ๋๋ค.
- ์ค๋๋ ๊ฐ์ฒด์์ ์๋ก์ด ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ์์ฃผ ์ ๊ฒ ์กด์ฌํ๋ค.
์ฆ, ๊ฐ์ฒด๋ ๋๋ถ๋ถ ์ผํ์ฑ๋๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์ ์ค๋ซ๋์ ๋จ์์๋ ๊ฒฝ์ฐ๋ ๋๋ฌผ๋ค. ๊ทธ๋์ Young, Old ์ด 2๊ฐ์ง ์์ญ์ผ๋ก ์ค๊ณ๋์๋ค.
๐ซง Young ์์ญ
- ์๋กญ๊ฒ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ํ ๋น๋๋ ์์ญ
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ๊ธ๋ฐฉ Unreachable์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์, ๋ง์ ๊ฐ์ฒด๊ฐ Young ์์ญ์ ์์ฑ๋์๋ค๊ฐ ์ฌ๋ผ์ง๋ค.
- Young ์์ญ์ ๋ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ Minor GC๋ผ๊ณ ํ๋ค.
๐ซง Old ์์ญ
- Young ์์ญ์์ Reachable ์ํ๋ฅผ ์ ์งํ๋ฉฐ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ๋ณต์ฌ๋๋ ์์ญ
- Young ์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋น๋๋ฉฐ, ์์ญ์ ํฌ๊ธฐ๊ฐ ํฐ ๋งํผ ๊ฐ๋น์ง๋ ์ ๊ฒ ๋ฐ์ํ๋ค.
- Old ์์ญ์ ๋ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ Major GC๋ผ๊ณ ํ๋ค.
๐ค Old ์์ญ์ด Young ์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋น๋๋ ์ด์ ๋?
Young ์์ญ์ ์๋ช ์ด ์งง์ ๊ฐ์ฒด๋ค์ ํฐ ๊ณต๊ฐ์ ํ์๋ก ํ์ง ์์ผ๋ฉฐ, ํฐ ๊ฐ์ฒด๋ค์ Young ์์ญ์ด ์๋๋ผ ๋ฐ๋ก Old ์์ญ์ ํ ๋น๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ฝ Old ์์ญ ์๋ ๊ฐ์ฒด๊ฐ Young ์์ญ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด Old ์์ญ์ ์๋ ์นด๋ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ค.
์นด๋ ํ ์ด๋ธ์ด๋?
512 ๋ฐ์ดํธ์ ๋ฉ์ด๋ฆฌ๋ก ๋์ด์์ผ๋ฉฐ Old ์์ญ์ ์๋ ๊ฐ์ฒด๊ฐ Young ์์ญ์ ์๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋๋ง๋ค ๊ทธ์ ๋ํ ์ ๋ณด๊ฐ ํ์๋๋ค.
์นด๋ํ ์ด๋ธ์ด ๋์ ๋ ์ด์ ๋ Young ์์ญ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์งํ๋ ๋, Young ์์ญ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ Old ์์ญ์ ๋ชจ๋ ์๋ณํด ๋ณด๋ ๊ฑด ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ์นด๋ ํ ์ด๋ธ๋ง ์กฐํํด์ GC์ ๋์์ธ์ง ํ๋ณํ๊ธฐ ์ํด์์ด๋ค.
๐ค ๊ทธ๋ ๋ค๋ฉด Perm ์์ญ์ ์ ์ฌ๋ผ์ก์๊น?
Perm ์์ญ์์ ๋ฌด์์ ํ์๊น?
- JVM์์ ํด๋์ค ๋ฉํ๋ฐ์ดํฐ(ํด๋์ค, ๋ฉ์๋, ํ๋ ์ ๋ณด)๋ฅผ ์ ์ฅํ๋ ๊ณณ
- ํด๋์ค ๋ก๋๋ ํด๋์ค ํ์ผ์ ์ฝ์ด๋ค์ฌ์ ์ด ์์ญ์ ํด๋์ค ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ์ด ์ ๋ณด๋ค์ JVM์คํ ๋์ค์ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉฐ JVM ์ข ๋ฃ ์๊น์ง ์ ์ง๋จ
JAVA8 ์ดํ๋ก๋ Metaspace ์์ญ์ผ๋ก ๋์ฒด๋์๋ค.
Metaspace๋?
- Perm ์์ญ์์ ์ ์ฅํ๋ Class์ Meta ์ ๋ณด๋ค์ด ์ด ์์ญ์ ์ ์ฅ
- Native Memory ์์ญ์ ์์นํ๋ฉฐ, JVM์ด ์๋ OS ๋ ๋ฒจ์์ ๊ด๋ฆฌ
- ํด๋์ค ๋ฉํ๋ฐ์ดํฐ์ ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ๋ ์ผ๋ถ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฅ
์ ๋์ฒด๋์์๊น?
- Perm ์์ญ์ ๋ฉ๋ชจ๋ฆฌ ๋์, OutOfMemoryError ๋ฑ๊ณผ ๊ฐ์ ๋ฌธ์
- ํด๋์ค ๋ก๋ฉ ๋ฐ ์ธ๋ก๋ฉ ๊ณผ์ ์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ์ ๋น๋ฒํ ๋ฐ์์ผ๋ก ์ธํด ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ ์ฌ๊ฐํด์ก๋ค.
- ํด๋์ค ๋ฉํ๋ฐ์ดํฐ๋ฅผ Native Memory์ ์ ์ฅํ๋ฉด์, JVM์์์ OutOfMemoryError ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋ค.
๐ฑ Reachability vs Unrechability
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง์ธ์ง ํ๋จํ๊ธฐ ์ํด์ Reachability๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ๋ค.
๊ฐ์ฒด์ ๋ํด์ ๋ํผ๋ฐ์ค๊ฐ ์๋ค๋ฉด Reachable๋ก ๊ตฌ๋ถํ๊ณ , ๊ฐ์ฒด์ ์ ํจํ ๋ํผ๋ฐ์ค๊ฐ ์๋ค๋ฉด Unreachable์ผ๋ก ๊ตฌ๋ถํด ์๊ฑฐํ๋ค.
JVM์์๋ ์ค์ง์ ์ธ ๊ฐ์ฒด๋ค์ Heap์ ์์ฑ๋๊ณ , Method Area์ Stack์์๋ Heap ์์ญ์ ๊ฐ์ฒด์ ์ฃผ์๋ง ์ฐธ์กฐํ๋ ํ์์ผ๋ก ๊ตฌ์ฑ๋๋ค. ํด๋น ๊ทธ๋ฆผ์์ Heap ์์ญ์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ Unreachable๋ก ๊ตฌ๋ถ๋์ด GC์ ๋์์ด ๋๋ ๊ฒ์ด๊ณ , ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ค์ Reachable๋ก ๊ตฌ๋ถ๋์ด ์ ๊ฑฐ๋์ง ์๋๋ค.
๐ฑ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์ ๋ฐฉ์
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก 2๊ฐ์ง ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๊ฒ ๋๋ค.
1. Stop The Word
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์คํํ๊ธฐ ์ํด JVM์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์ ๋ฉ์ถ๋ ์์ ์ด๋ค.
GC๊ฐ ์คํ๋ ๋๋ GC๋ฅผ ์คํํ๋ ์ฐ๋ ๋๋ฅผ ์ ์ธํ ๋ชจ๋ ์ค๋ ๋๋ค์ ์์ ์ด ์ค๋จ๋๊ณ GC๊ฐ ์๋ฃ๋๋ฉด ์์ ์ด ์ฌ๊ฐ๋๋ค.
์ฌ๊ธฐ์ ๋ชจ๋ ์ฐ๋ ๋์ ์์ ์ด ์ค๋จ๋๋ค๊ณ ํ๋๋ฐ, ๋ชจ๋ ์ค๋ ๋ ์์ ์ด ์ค๋จ๋๊ฒ ๋๋ฉด ๋น์ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ถ๊ธฐ ๋๋ฌธ์ GC์ ์ฑ๋ฅ ๊ฐ์ ์ ์ํด ํ๋ํ๋ค๊ณ ํ๋ฉด stop-the-world์ ์๊ฐ์ ์ค์ด๋ ์์ ์ ํ๋ค.
๊ฐ์ฒด ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ์ถ์ ํ๋๊ฑด ์คํ ์ค์๋ ํ ์ ์๊ธด ํ์ง๋ง, ์ด ์์ ์ ๋งค์ฐ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ค๋จํ๊ณ ์คํํ๋ ๊ฒ์ด๋ค!
2. Mark and Sweep
- Mark : ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ณํ๋ ์์
- Sweep : Mark ๋จ๊ณ์์ ์ฌ์ฉ๋์ง ์์์ผ๋ก ์๋ณ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ์์
Stop The World๋ฅผ ํตํด ๋ชจ๋ ์์ ์ ์ค๋จ์ํค๋ฉด GC๋ ์คํ์ ๋ชจ๋ ๋ณ์ ๋๋ reachable ๊ฐ์ฒด๋ฅผ ์ค์บํ๋ฉด์ ๊ฐ๊ฐ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋์ง๋ฅผ ์ถ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ๋๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ณํ๋๋ฐ ์ด๋ฐ ๊ณผ์ ์ Mark๋ผ๊ณ ํ๋ค.
์ดํ์ Mark๋์ง ์์ ๊ฐ์ฒด๋ค์ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๋ ๊ณผ์ ์ Sweep๋ผ๊ณ ํ๋ค.
Minor GC
์์์ ์ค๋ช ํ๋ฏ์ด Young ์์ญ์์ ์คํ๋๋ ๊ฒ์ด Minor GC์ด๋ค.
Young ์์ญ์๋ 1๊ฐ์ Eden์์ญ๊ณผ 2๊ฐ์ Survivor์์ญ์ผ๋ก ๋๋๋ค.
- Eden : ์๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ํ ๋น๋๋ ์์ญ
- Survivor : ์ต์ 1๋ฒ์ GC ์ด์ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ์์ญ
์๋ก ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉด Young ์์ญ์์๋ Eden ์์ญ์ ํ ๋น๋๋ค. ์ดํ Eden ์์ญ์ด ๊ฝ ์ฐจ๊ฒ ๋๋ฉด, Minor GC๊ฐ ๋ฐ์ํ๋ ๋ฐ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ ํด์ ๋๊ณ , ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ Survivor ์์ญ์ผ๋ก ์ฎ๊ฒจ์ง๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ Servivor๋ 2๊ฐ๊ฐ ์๋๋ฐ ์ด ์ค ํ๋์๋ง ์กด์ฌํ๊ฒ ๋๋ค.
- ์๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ Eden์์ญ์ ํ ๋น๋๋ค.
- ๊ฐ์ฒด๊ฐ ๊ณ์ ์์ฑ๋๊ณ Eden์์ญ์ด ๊ฝ์ฐจ๊ณ Minor GC๊ฐ ์คํ๋๋ค.
- 1~2 ๊ณผ์ ์ ๋ฐ๋ณต๋๋ค๊ฐ Survivor ์์ญ์ด ๊ฝ ์ฐจ๊ฒ ๋๋ฉด Survivor ์์ญ์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ ๋ค๋ฅธ Survivor ์์ญ์ผ๋ก ์ด๋์ํจ๋ค. (์ฌ๊ธฐ์ 1๊ฐ์ Survivor์์ญ์ ๋ฐ๋์ ๋ฐ ์ํ๊ฐ ๋๋ค.)
- ์ด๋ฐ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค๊ฐ ์ด์๋จ์ ๊ฐ์ฒด๋ Old ์์ญ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค.
์ด๋, ์์กด ํ์๋ฅผ ์นด์ดํธํ๋๋ฐ ์ด์๋จ์ ํ์๋ฅผ ์๋ฏธํ๋ age๋ฅผ Object Header์ ๊ธฐ๋กํ๋ค. ์ดํ, Minor GC๋ Object Header์ age๋ฅผ ๋ณด๊ณ ์ด๋ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
์์๋ ์ ์๋ฏ์ด, ํด๋น ๊ณผ์ ์ ์คํํ ๋ Survivor์์ญ์ ๋ฐ๋์ ํ๋๋ง ์ฐจ ์์ด์ผ ํ๋ค. ๋ชจ๋ 0์ด๊ฑฐ๋ ๋ชจ๋ ์ฐจ์๋ค๋ฉด ๋น์ ์์ ์ธ ์คํ์ด๋ค.
JVM์์ Eden ์์ญ์ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒ ํ ๋นํ๊ธฐ ์ํด์ bump the pointer์ TLABs(Thread-Local Allocation Buffers)๋ผ๋ ๊ธฐ์ ์ ์ฌ์ฉํ๋ค.
bump the pointer
- Eden ์์ญ์ ๋ง์ง๋ง ํ ๋น๋ ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ์บ์ฑํด ๋๋ ๊ฒ
- ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ํด ์ ํจํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ํ์ ์์ด ๋ง์ง๋ง ์ฃผ์์ ๋ค์ ์ฃผ์๋ฅผ ์ฌ์ฉํ๊ฒ ํจ์ผ๋ก์จ ์๋๋ฅผ ๋์ธ๋ค.
- ์๋ก์ด ๊ฐ์ฒด๋ฅผ ํ ๋นํ ๋ ๊ฐ์ฒด์ ํฌ๊ธฐ๊ฐ Eden ์์ญ์ ์ ํฉํ์ง๋ง ํ๋ณํ๋ฉด ๋๋ฏ๋ก ๋น ๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์๋ค.
- ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ Eden ์์ญ์ ํ ๋นํ ๋ lock์ ๊ฑธ์ด์ ๋๊ธฐํํด์ค์ผ ํ๋ค.
TLABs
- ๊ฐ๊ฐ์ ์ฐ๋ ๋๋ง๋ค Eden์์ญ์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ธฐ ์ํ ์ฃผ์๋ฅผ ๋ถ์ฌํจ์ผ๋ก์จ ๋๊ธฐํ ์์ ์์ด ๋น ๋ฅด๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋๋ก ํ๋ ๊ธฐ์ ์ด๋ค.
- ๊ฐ๊ฐ์ ์ฐ๋ ๋๋ ์์ ์ด ๊ฐ๋ ์ฃผ์์๋ง ๊ฐ์ฒด๋ฅผ ํ ๋นํจ์ผ๋ก์จ ๋๊ธฐํ ์์ด bump the pointer๋ฅผ ํตํด ๋น ๋ฅด๊ฒ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋๋ก ํ๊ณ ์๋ค.
Major GC
Young ์์ญ์์ ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด๋ Old ์์ญ์ผ๋ก ์ด๋ํ๋ค.
Major GC๋ ๊ฐ์ฒด๋ค์ด ๊ณ์ ์ด๋๋์ด Old ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด ๋ฐ์ํ๋ค. Young ์์ญ์ Old ์์ญ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ GC๊ฐ ๋ณดํต 0.5์ด์์ 1์ด ์ฌ์ด์ ๋๋๊ธฐ ๋๋ฌธ์ Minor GC์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฐ ์ํฅ์ ์ฃผ์ง ์์ง๋ง, Old ์์ญ์ Young ์์ญ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ๊ฐ ํฌ๊ณ Young์์ญ์ ์ฐธ์กฐํ ์๋ ์๊ธฐ ๋๋ฌธ์ Major GC๋ Minor GC๋ณด๋ค ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ฉฐ, 10๋ฐฐ ์ด์์ ์๊ฐ์ด ์์๋๋ค.
+) Young๊ณผ Old ์์ญ์ ๋์์ ์ฒ๋ฆฌํ๋ GC๋ Full GC๋ผ๊ณ ํ๋ค.
Major GC๊ฐ ์ผ์ด๋๋ฉด ์ค๋ ๋๊ฐ ๋ฉ์ถ๊ณ Mark and Sweep ์์ ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ CPU์ ๋ถํ๋ฅผ ์ค์ ๋ฉ์ถ๊ฑฐ๋ ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๋ ํ์์ด ์ผ์ด๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
๐ฑ ๊ฐ๋น์ง ์ปฌ๋ ์ ์๊ณ ๋ฆฌ์ฆ
1. Serial GC
# Serial GC ์คํ ๋ช
๋ น์ด
# -XX:+UseSerialGC: Serial GC ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋๋ก ์คํ
java -XX:+UseSerialGC -jar Application.java
serial GC๋ Young์์ญ์์ Mark Sweep๋๋ก ์ํํ์ง๋ง Old์์ญ์์๋ Mark Sweep Compact์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฌ์ฉ๋๋ค.
๊ธฐ์กด์ Mark Sweep์ Compact๊ฐ ์ถ๊ฐ๋ ๊ฒ์ด๋ค. Compact๋ Heap์์ญ์ ์ ๋ฆฌํ๊ธฐ ์ํ ๋จ๊ณ๋ก ์ ํจํ ๊ฐ์ฒด๋ค์ด ์ฐ์๋๊ฒ ์์ด๋๋ก ํ์ ๊ฐ์ฅ ์๋ถ๋ถ๋ถํฐ ์ฑ์์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ๋ถ๋ถ๊ณผ ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ ๊ฒ์ด๋ค.
- ์๋ฒ์ CPU์ฝ์ด๊ฐ 1๊ฐ์ผ ๋ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์์ผ๋ฉฐ, ๋ชจ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด 1๊ฐ์ ์ค๋ ๋๋ง ์ด์ฉํ๋ค.
- ๋ฐ๋ผ์ ๋ณดํต ์ค๋ฌด์์ ์ฌ์ฉํ๋ ์ผ์ด ์๋ค.
2. Parallel GC
# GC ์ค๋ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก cpu ๊ฐ์๋งํผ ํ ๋น
# ์ต์
์ ํตํด GC๋ฅผ ์ํํ ์ฐ๋ ๋์ ๊ฐฏ์ ๋ฑ์ ์ค์ ๊ฐ๋ฅ
java -XX:+UseParallelGC -jar Application.java
# -XX:ParallelGCThreads=N : ์ฌ์ฉํ ์ฐ๋ ๋์ ๊ฐฏ์
๊ธฐ๋ณธ ์ฒ๋ฆฌ ๊ณผ์ ์ Serial GC์ ๋์ผํ์ง๋ง Parallel GC๋ ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋๋ฅผ ํตํด ๋ณ๋ ฌ์ ์ผ๋ก GC๋ฅผ ์ํํจ์ผ๋ก์จ ์ค๋ฒํค๋๋ฅผ ์๋นํ ์ค์ฌ์ค๋ค. ๋ฉํฐ ํ๋ก์ธ์ ๋๋ ๋ฉํฐ ์ค๋ ๋ ๋จธ์ ์์ ์ค๊ฐ ๊ท๋ชจ๋ถํฐ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ๊ณ ์๋์์ผ๋ฉฐ, ์ต์ ์ ํตํด ์ต๋ ์ง์ฐ ์๊ฐ ๋๋ GC๋ฅผ ์ํํ ์ค๋ ๋ ๊ฐ์ ๋ฑ์ ์ค์ ํด ์ค ์ ์๋ค.
- Java8๊น์ง ๊ธฐ๋ณธ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ก ์ฌ์ฉ๋์์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ถ๋ ๊ฒ์ ํผํ ์ ์์ด ๊ฐ์ ๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋ฑ์ฅํ๋ค.
3. Parallel Old GC
java -XX:+UseParallelOldGC -jar Application.java
# -XX:ParallelGCThreads=N : ์ฌ์ฉํ ์ฐ๋ ๋์ ๊ฐฏ์
Parallel GC์์ Old ์์ญ์ ์๋ก์ด ์๊ณ ๋ฆฌ์ฆ์ ์ถ๊ฐํ ๋ฒ์ ์ด๋ค. Young ์์ญ ๋ฟ๋ง ์๋๋ผ Old์์ญ์์๋ ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ผ๋ก GC๋ฅผ ์ํํ๋ค.
4. G1(Garbage First) GC
java -XX:+UseG1GC -jar Application.java
Java7 ๋ฒ์ ๋ถํฐ ์ง์๋๊ธฐ ์์ํ์ผ๋ฉฐ ๊ธฐ์กด์ GC ์๊ณ ๋ฆฌ์ฆ์์๋ Heap ์์ญ์ ๋ฌผ๋ฆฌ์ ์ผ๋ก Young ์์ญ๊ณผ Old ์์ญ์ผ๋ก ๋๋์ด ์ฌ์ฉํ์์ง๋ง, G1 GC๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋๋์ง ์๋๋ค. ๋์ Region(์ง์ญ)์ ๊ฐ๋ ์ ๋์ ํด์ Heap์ ๊ท ๋ฑํ๊ฒ ์ฌ๋ฌ ์ง์ญ์ผ๋ก ๋๋๊ณ , ๊ฐ ์ง์ญ์ ์ญํ ๊ณผ ํจ๊ป ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ตฌ๋ถํด์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋ค.
- ๊ฐ๋น์ง๋ก ๊ฐ๋ ์ฐฌ ์์ญ์ ๋น ๋ฅด๊ฒ ํ์ํ์ฌ ๋น ๊ณต๊ฐ์ ํ๋ณดํ๊ธฐ ๋๋ฌธ์ GC ๋น๋๊ฐ ์ค์ด๋๋ ํจ๊ณผ๋ฅผ ์ป๊ฒ ๋๋ค.
- ์ด์ ์๋ Eden → Survivor0 → Survivor1 ์์๋ก ์ด๋ํ์ง๋ง, G1 GC์์๋ ์์ฐจ์ ์ผ๋ก ์ด๋ํ์ง ์๊ณ ๋ ํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํ๋ ์์น๋ก ๊ฐ์ฒด๋ฅผ ์ฌํ ๋น ์ํจ๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ํด์ ์์ธํ ์๊ฐํด๋ณธ ์ ์ด ์์๋๋ฐ, ๊ธ๋ก ์ ๋ฆฌํ๋๊น ๋จธ๋ฆฟ์์์๋ ์ ๋ฆฌ๊ฐ ๋ ๊ฒ ๊ฐ๋ค!
reference
https://jellili.tistory.com/60
'JAVA & OOP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] HashCode์ equals ์ค๋ฒ๋ผ์ด๋ฉ (0) | 2024.03.21 |
---|---|
[JAVA] Optional ํด๋์ค์ orElse์ orElseGet ์ฐจ์ด (0) | 2024.03.15 |
Java 17์ ์ฌ์ฉํ๋ ์ด์ (2) | 2024.01.06 |
JAVA :: HashMap, hashing ๊ฐ๋ ์ ๋ฆฌ (0) | 2022.08.14 |
JAVA :: Optional ํด๋์ค ๊ฐ๋ ์ ๋ฆฌ (0) | 2022.07.31 |