๐ค ๋ค์ด๊ฐ๊ธฐ ์ ์..
- C/C++์์๋ ๋ฉ๋ชจ๋ฆฌ๋์(Memory Leak)์ ๋ง๊ธฐ ์ํด ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ, ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ํด์ ํด์ฃผ์ด์ผ ํ์ต๋๋ค. ํ์ง๋ง JAVA์์๋ JVM์ด ๊ตฌ์ฑ๋ JRE(Java Runtime Environment)๊ฐ ์ ๊ณต๋๋ฉฐ, ๊ทธ ๊ตฌ์ฑ์์ ์ค ํ๋์ธ Garbage Collection์ด ์๋์ผ๋ก ๋ญ๋น๋๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ํ๊ดดํฉ๋๋ค.
stop-the-world
๋? : Garbage Collection๋ฅผ ์คํํ๊ธฐ ์ํด JVM์ด ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ๋ฉ์ถ๋ ๊ฒ์ด๋ค. ์ด๋ค GC(*Garbage Colletion)์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋๋ผ๋stop-the-world
๋ ๋ฐ์ํ๊ฒ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก GCํ๋์ ์ดstop-the-world
์๊ฐ์ ์ค์ด๋ ๊ฒ์ด๋ค.- GC๋ฅผ ํด๋ ๋์ด์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์๋๋ฐ ๊ณ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ค๊ณ ํ๋ฉด,
OutOfMemoryError
๊ฐ ๋ฐ์ํ์ฌ WAS๊ฐ ๋ค์ด๋ ์๋ ์์ต๋๋ค. ํ(Hang) ์ฆ, ์๋ฒ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌ ๋ชปํ๊ณ ์๋ ์ํ๊ฐ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ท๋ชจ ์๋ JAVA ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐํ๊ธฐ ์ํด์๋ GC์ ๋ํด ์ ์์์ผ ํฉ๋๋ค.
Garbage
๋, ์ฌ์ฉ๋์ด ์ง์ง ์๋ ๋ฉ๋ชจ๋ฆฌ์ง๋ง, ๋ฐฉ์ถ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ปํ๋ค.
์ฌ์ฉ๊ณผ ๋ฐฉ์ถ์ ์ดํดํ๊ธฐ ์ํด์๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ผ์ดํ ์ธ์ดํด์ ์์์ผ ํ๋ค.
๋ฉ๋ชจ๋ฆฌ๋ ์์ 3๋จ๊ณ์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
> ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
> ๋ฉ๋ชจ๋ฆฌ ๋ฐฉ์ถ
์์์ด๋ค. ์ฌ๊ธฐ์ ๋งํ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
์ ์์๋ณด๋ฉด Garbage Collection์ ๋ ์ ์ดํดํ ์ ์๋ค.
๋ฉ๋ชจ๋ฆฌ
๋, 0,1๋ก ํํ๋์ด์ง๋ ์ด๋ ํ ๊ฐ์ด ์ด๋๊ฐ์ ์ ์ฅ์ด ๋์ด์ ธ์๊ณ , ์ ์ฅ๋์ด ์๋ ๊ทธ ์ฃผ์๋ฅผ ์๋ฏธํ๋ค. ์ฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐ๊ฑฐ๋ ์ฝ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐฉ์ถ
์ด ์ผ์ด๋์ง ์๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? release๋์ง ์์ ์ํ์ด๋ฏ๋ก, ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ถ์ ํ๊ณ ์ธ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋์ด์ ์ฌ์ฉ๋์ง ์๊ณ ์๋์ง๋ฅผ ํ์
ํ์ฌ ์๋ ํ์ํ๋ค.
์ฆ, ์๋์ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ํ์ํ ๋์์ด ๋๋ค.
์ด์ฒ๋ผ ๊ฐ์ฒด๊ฐ ์ค์ง์ ์ผ๋ก ์๋ Heap์์ญ์์ ์๋ฌด๊ณณ์์๋ ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด(๋นจ๊ฐ์)๋ ์ญ์ ๋์์ด ๋๋ค.
์์)
1. ๊ฐ์ฒด๊ฐ null์ธ ๊ฒฝ์ฐ (์: String str = null)
2. ๋ธ๋ญ ์คํ ์ข
๋ฃ ํ, ๋ธ๋ญ ์์์ ์์ฑ๋ ๊ฐ์ฒด
3. ๋ถ๋ชจ ๊ฐ์ฒด๊ฐ null์ธ ๊ฒฝ์ฐ, ํฌํจํ๋ ์์ ๊ฐ์ฒด
๋จผ์ ํ๋ก์ธ์ค๊ฐ ๋งํน
์ ํธ์ถํ๋ค. ์ด ์์์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ์ฉ๋๋์ง ์ฌ๋ถ๋ฅผ ํ๋จ(์๋ณ)ํ๋ค. ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๋ ํ๋์, ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ ์ฃผํฉ์์ผ๋ก ๋ณด์ฌ์ง๋ค. ๋งํน
๋จ๊ณ์์๋ ๋ชจ๋ ์ค๋ธ์ ํธ๋ฅผ ์ค์บํ๋ค. ๋ฐ๋ผ์ ๊ธด ์๊ฐ์ด ์๋ชจ๋๋ค.
์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด(Unreachable, ์ฃผํฉ์)์ ์ ๊ฑฐํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ๋ค. ๋ฉ๋ชจ๋ฆฌ Allocator๋ ๋ฐํ๋์ด ๋น์ด์ง ๋ธ๋ญ์ ์ฐธ์กฐ ์์น๋ฅผ ์ ์ฅํด ๋์๋ค๊ฐ ์๋ก์ด ์ค๋ธ์ ํธ๊ฐ ์ ์ธ๋๋ฉด ํ ๋นํด์ค๋ค.
ํผํฌ๋จผ์ค ํฅ์์ ์ํด, ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด(์ฃผํฉ์)์ ์ง์ ๋ค๋ฉด ๋จ์์๋ ์ฐธ์กฐ๋ ๊ฐ์ฒด(Reachable)๋ฅผ ๋ฌถ์ด๋๋๋ค. ์ด๋ค์ ๋ฌถ์์ผ๋ก์ ๊ณต๊ฐ์ด ์๊ธฐ๊ฒ ๋๋ฏ๋ก, ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ๋ ๋ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์งํํ ์ ์๊ฒ ๋๋ค.
โ GC์ ๋์ ์๊ณ ๋ฆฌ์ฆ(๋์๊ณผ์ ๋ ๋์ผ)
๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ๋์ํ๋ ์๋ฆฌ๋ก ๋ฃจํธ์์๋ถํฐ ํด๋น ๊ฐ์ฒด์ ์ ๊ทผ ๊ฐ๋ฅํ์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ํด์ ์ ๊ธฐ์ค์ผ๋ก ์ผ์ต๋๋ค. Mark And Sweep์ ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ด 3๊ฐ์ง ๊ณผ์ ์ผ๋ก ๋๋๊ฒ ๋ฉ๋๋ค.
- Mark ๊ณผ์ : ๋จผ์ Root๋ก๋ถํฐ ๊ทธ๋ํ ์ํ๋ฅผ ํตํด ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ค์ ์ฐพ์๋ด์ด ๊ฐ๊ฐ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ ์กฐํ๊ณ ์๋์ง ์ฐพ์์ ๋งํนํฉ๋๋ค.
- Sweep ๊ณผ์ : ์ฐธ์กฐํ๊ณ ์์ง ์์ ๊ฐ์ฒด ์ฆ Unreachable ๊ฐ์ฒด๋ค์ Heap์์ ์ ๊ฑฐํฉ๋๋ค.
- Compact ๊ณผ์ : Sweep ํ์ ๋ถ์ฐ๋ ๊ฐ์ฒด๋ค์ Heap์ ์์ ์ฃผ์๋ก ๋ชจ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋ ๋ถ๋ถ๊ณผ ๊ทธ๋ ์ง ์์ ๋ถ๋ถ์ผ๋ก ์์ถํฉ๋๋ค. (๊ฐ๋น์ง ์ปฌ๋ ํฐ ์ข ๋ฅ์ ๋ฐ๋ผ ํ์ง ์๋ ๊ฒฝ์ฐ๋ ์์)
๊ฐ์ ๋ค์ ์ธ๋(generation)๋ฅผ ๋ถ๋ฆฌํ๊ณ , ๋๋ถ๋ถ์ GC์ฌ์ดํด์์ ํน์ ์ธ๋์ ๋ํด์๋ง ์์ ์ ์ํํ๋ ๊ฒ
GC์ ๋์ ์๊ณ ๋ฆฌ์ฆ์ธ Mark & Compact
๋ JVM์๊ฒ ๋นํจ์จ์ ์ด๋ค. ์์ ์ฌ์ง๊ณผ ๊ฐ์ด ์๊ฐ์ด ์ง๋ ์๋ก ์ ์ ๊ฐ์ฒด๋ง ๋จ๋ ๊ฒ์ ๋ณด๊ณ Weak Generational Hypothesis๊ฐ ๋๋๋์๋ค.
Weak Generational Hypothesis
: ์ ๊ท๋ก ์์ฑํ ๊ฐ์ฒด์ ๋๋ถ๋ถ์ ๊ธ๋ฐฉ ์ฌ์ฉํ์ง ์๋ ์ํ๊ฐ ๋๊ณ , ์ค๋๋ ๊ฐ์ฒด์์ ์ ๊ท ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ๋งค์ฐ ์ ๊ฒ ์กด์ฌํ๋ค๋ ๊ฐ์ค. ์ฆ, ๊ฐ์ฒด๋ ๋๋ถ๋ถ ์ผํ์ฑ๋๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์ ์ค๋ซ๋์ ๋จ์์๋ ๊ฒฝ์ฐ๋ ๋๋ฌผ๋ค๋ ๊ฒ. ํด๋น ๊ฐ์ค์ ๊ธฐ๋ฐ์ผ๋ก young/old์์ญ์ผ๋ก ๋๋์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ถํ ํ์๋ค. Minor GC๋ฅผ ์ ํํ ์ดํดํ๊ธฐ ์ํด์๋ Young ์์ญ์ ๊ตฌ์กฐ์ ๋ํด ์ดํด๋ฅผ ํด์ผ ํ๋ค. Young ์์ญ์ 1๊ฐ์ Eden ์์ญ๊ณผ 2๊ฐ์ Survivor ์์ญ, ์ฆ ์ด 3๊ฐ์ง๋ก ๋๋์ด์ง๋ค.
Major GC๋ ๊ฐ์ฒด๋ค์ด ๊ณ์ Promotion๋์ด Old ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด ๋ฐ์ํ๊ฒ ๋๋ค.
*๐ค : Young ์์ญ์ ์ผ๋ฐ์ ์ผ๋ก Old ์์ญ๋ณด๋ค ํฌํค๊ฐ ์๊ธฐ ๋๋ฌธ์ GC๊ฐ ๋ณดํต 0.5์ด์์ 1์ด ์ฌ์ด์ ๋๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Minor GC๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌ๊ฒ ์ํฅ์ ์ฃผ์ง ์๋๋ค. ํ์ง๋ง Old ์์ญ์ Young ์์ญ๋ณด๋ค ํฌ๋ฉฐ Young ์์ญ์ ์ฐธ์กฐํ ์๋ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Major GC๋ ์ผ๋ฐ์ ์ผ๋ก Minor GC๋ณด๋ค ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฐ๋ค.