C/C++ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak)๋ฅผ ๋ง๊ธฐ ์ํด ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ ์ฌ์ฉ์ํ์ง ์๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ํด์ ํด์ฃผ์ด์ผ ํ์ง๋ง, JAVA์์๋ JVM(Java Virtual Machine)์ด ๊ตฌ์ฑ๋ JRE(Java Runtime Environment)๊ฐ ์ ๊ณต๋๋ฉฐ, ๊ทธ ๊ตฌ์ฑ ์์ ์ค ํ๋์ธ Garbage Collection(์ดํ GC)์ด ์๋์ผ๋ก ์ฌ์ฉํ์ง ์๋ ๊ฐ์ฒด๋ฅผ ํ๊ดดํ๋ค.
GC์ ๋ํด์ ์์๋ณด๊ธฐ ์ ์ 'stop-the-world'๋ผ๋ ์ฉ์ด๋ฅผ ์์์ผํ๋ค. 'stop-the-world'๋, GC๋ฅผ ์คํํ๊ธฐ ์ํด JVM์ด ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ๋ฉ์ถ๋ ๊ฒ์ ๋๋ค. ์ด๋ค GC ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋๋ผ๋ 'stop-the-world'๋ ๋ฐ์ํ๊ฒ ๋๋๋ฐ, ๋๊ฐ์ ๊ฒฝ์ฐ GC ํ๋์ ์ด 'stop-the-world' ์๊ฐ์ ์ค์ด๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค๋ค.
GC๋ฅผ ํด๋ ๋์ด์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์๋๋ฐ ๊ณ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ค๊ณ ํ๋ฉด, OutOfMemoryError๊ฐ ๋ฐ์ํ์ฌ WAS๊ฐ ๋ค์ด๋ ์๋ ์๋ค. ํ(Hang) ์ฆ, ์๋ฒ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌ ๋ชปํ๊ณ ์๋ ์ํ๊ฐ ๋๋ค. ๋ฐ๋ผ์ ๊ท๋ชจ ์๋ JAVA ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐํ๊ธฐ ์ํด์๋ GC์ ๋ํด ์ ์์์ผํ๋ค๊ณ ํ๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection)
JVM์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด๋ผ๋ ํ๋ก์ธ์ค๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์๋ฐ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์์ ์ผ๋ก ์ฐพ์๋ด์ ์ ๊ฑฐํ๋ ์ญํ ์ ํ๋ค.
์๋ฐ์์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ GC๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ํตํ์ฌ ๊ด๋ฆฌ(automatic memory management)ํ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ์๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ก์ง์ ๋ง๋ค ํ์๊ฐ ์๊ณ , ์ ๋๋ก ๋ง๋ค์ด์๋ ์๋๋ค.
์๋ฐ์์ ์ฐ๋ ๊ธฐ๋ ๊ฐ์ฒด์ด๋ค. ํ๋์ ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ๊ณ , ํ์ํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ด์ผ ํ๋ค.
์ฝ๋์์ a๋ผ๋ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ ธ ๋ฉ๋ชจ๋ฆฌ์ ํ๋ถ๋ถ์ ์ ์ ํ๊ฒ ๋๊ณ , ํน์ ๋ฉ์๋ ํธ์ถํ ํ ์ํ์ด ์๋ฃ๋์ด ํด๋น ๊ฐ์ฒด๊ฐ ๋์ด์ ํ์์๋ ๊ฐ์ฒด, ์ฐ๋ ๊ธฐ๊ฐ ๋ฉ๋๋ค. ์ด ์ฐ๋ ๊ธฐ ๊ฐ์ฒด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ์์ ์ GC(Garbage Collection)๋ผ๊ณ ํ๋ค.
- ์์คํ ์์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํํ๋ ๋ถ๋ถ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ผ ๋ถ๋ฅธ๋ค.
JVM์ ๋ฉ๋ชจ๋ฆฌ๋ ์ด 5๊ฐ์ง ์์ญ(class, stack, heap, native method, PC)์ผ๋ก ๋๋๋๋ฐ, GC๋ ํ ๋ฉ๋ชจ๋ฆฌ๋ง ๋ค๋ฃฌ๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ GC์ ๋์์ด ๋ฉ๋๋ค.
- ๊ฐ์ฒด๊ฐ NULL์ธ ๊ฒฝ์ฐ (ex. String str = null)
- ๋ธ๋ญ ์คํ ์ข ๋ฃ ํ, ๋ธ๋ญ ์์์ ์์ฑ๋ ๊ฐ์ฒด
- ๋ถ๋ชจ ๊ฐ์ฒด๊ฐ NULL์ธ ๊ฒฝ์ฐ, ํฌํจํ๋ ์์ ๊ฐ์ฒด
- GC๋ Weak Generational Hypothesis ์ ๊ธฐ๋ฐํ๋ค.
๋ฉ๋ชจ๋ฆฌ ํด์ ๊ณผ์ (3๋จ๊ณ)
์คํ์์ : ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ค์ ํ์ ํ ์ญ์ (Marking) → ์ญ์ ๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ๋ฐํ(Normal Deletion) → ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฌ์ฉ(Compacting)
1. Marking
- ํ๋ก์ธ์ค๋ ๋งํน์ ํธ์ถํ๋ค. GC๊ฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ์ฉ๋๋์ง ์๋์ง๋ฅผ ์ฐพ์๋ธ๋ค.
- ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๋ ํ๋์์ผ๋ก, ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ ์ฃผํฉ์์ผ๋ก ๋ณด์ฌ์ง๋ค.
- ๋ชจ๋ ์ค๋ธ์ ํธ๋ ๋งํน ๋จ๊ณ์์ ๊ฒฐ์ ์ ์ํด ์ค์บ๋์ด์ง๋ค. ๋ชจ๋ ์ค๋ธ์ ํธ๋ฅผ ์ค์บํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋ง์ ์๊ฐ์ ์๋ชจํ๊ฒ ๋๋ค.
2. Normal Deletion
- ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ Allocator๋ ๋ฐํ๋์ด ๋น์ด์ง ๋ธ๋ญ์ ์ฐธ์กฐ ์์น๋ฅผ ์ ์ฅํด๋๊ณ ์๋ก์ด ์ค๋ธ์ ํธ๊ฐ ์ ์ธ๋๋ฉด ํ ๋น๋๋๋ก ํ๋ค.
3. Compacting
- ํผํฌ๋จผ์ค๋ฅผ ํฅ์์ํค๊ธฐ ์ํด, ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๊ณ ๋ํ ๋จ์ ์ฐธ์กฐ๋์ด์ง๋ ๊ฐ์ฒด๋ค์ ๋ฌถ๋๋ค.
- ์ด๋ค์ ๋ฌถ์์ผ๋ก์ ๊ณต๊ฐ์ด ์๊ธฐ๋ฏ๋ก ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ ๋ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์งํ ํ ์ ์๋ค.
Generational Gabage Collection
์ธ๋ ๊ฐ์ GC
๋ฐฐ๊ฒฝ
์์ ๊ฐ์ด ๋ชจ๋ ๊ฐ์ฒด๋ฅผ Mark & Compact ํ๋ JVM์ ๋นํจ์จ์ ์ด๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด,
Y์ถ์ ํ ๋น๋ ๋ฐ์ดํธ์ ์์ด๊ณ X์ถ์ ๋ฐ์ดํธ๊ฐ ํ ๋น๋ ๋์ ์๊ฐ์ด๋ค. ๋ณด์๋ค์ํผ ์๊ฐ์ด ๊ฐ์๋ก ์ ์ ๊ฐ์ฒด๋ง์ด ๋จ๋๋ค. ์์ ๊ฐ์ ๊ทธ๋ํ์ ๊ธฐ๋ฐํ ๊ฒ์ด Weak Generational Hypothesis ์ด๋ค.
Weak Generational Hypothesis
์ ๊ท๋ก ์์ฑํ ๊ฐ์ฒด์ ๋๋ถ๋ถ์ ๊ธ๋ฐฉ ์ฌ์ฉํ์ง ์๋ ์ํ๊ฐ ๋๊ณ , ์ค๋๋ ๊ฐ์ฒด์์ ์ ๊ท ๊ฐ์ฒด๋ก์ ์ฐธ์กฐ๋ ๋งค์ฐ ์ ๊ฒ ์กด์ฌํ๋ค๋ ๊ฐ์ค
์ด ๊ฐ์ค์ ๊ธฐ๋ฐํ์ฌ ์๋ฐ๋ Young ์์ญ๊ณผ Old ์์ญ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ถํ ํ๊ณ , ์ ๊ท๋ก ์์ฑ๋๋ ๊ฐ์ฒด๋ Young ์์ญ์ ๋ณด๊ดํ๊ณ , ์ค๋ซ๋์ ์ด์๋จ์ ๊ฐ์ฒด๋ Old ์์ญ์ ๋ณด๊ดํ๋ค.
์์ญ
- Young ์์ญ(Yong Generation ์์ญ)
- ์๋กญ๊ฒ ์์ฑํ ๊ฐ์ฒด์ ๋๋ถ๋ถ์ด ์ฌ๊ธฐ์ ์์นํ๋ค.
- ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ๊ธ๋ฐฉ ์ ๊ทผ ๋ถ๊ฐ๋ฅ ์ํ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋ง์ ๊ฐ์ฒด๊ฐ Young ์์ญ์ ์์ฑ๋์๋ค๊ฐ ์ฌ๋ผ์ง๋ค.
- ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง๋ Minor GC ๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํฉ๋๋ค.
- Old ์์ญ(Old Generation ์์ญ)
- ์ ๊ทผ ๋ถ๊ฐ๋ฅ ์ํ๋ก ๋์ง ์์ Young ์์ญ์์ ์ด์๋จ์ ๊ฐ์ฒด๊ฐ ์ฌ๊ธฐ๋ก ๋ณต์ฌ๋๋ค.
- ๋๋ถ๋ถ Young ์์ญ๋ณด๋ค ํฌ๊ฒ ํ ๋นํ๋ฉฐ, ํฌ๊ธฐ๊ฐ ํฐ ๋งํผ Young ์์ญ๋ณด๋ค GC๋ ์ ๊ฒ ๋ฐ์ํฉ๋๋ค.
- ์ด ์์ญ์์ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ง ๋ Major GC(ํน์ Full GC) ๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํ๋ค.
- Permanet ์์ญ
- Method Area๋ผ๊ณ ๋ ํ๋ค.
- JVM์ด ํด๋์ค๋ค๊ณผ ๋ฉ์๋๋ค์ ์ค๋ช ํ๊ธฐ ์ํด ํ์ํ ๋ฉํ๋ฐ์ดํฐ๋ค์ ํฌํจํ๊ณ ์๋ค.
- JDK 8๋ถํฐ๋ PermGen์ Metaspace๋ก ๊ต์ฒด๋๋ค.
๊ณผ์
- ์ด๋ ํ ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ค์ด์ค๋ฉด Eden Space์ ํ ๋นํ๋ค.
- Eden space๊ฐ ๊ฐ๋์ฐจ๊ฒ ๋๋ฉด, minor garbage collection์ด ์์๋๋ค.
- ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๋ค์ ์ฒซ ๋ฒ์งธ survivor(S0)๋ก ์ด๋๋์ด์ง๊ณ , ๋น ์ฐธ์กฐ ๊ฐ์ฒด๋ Eden space๊ฐ clear ๋ ๋ ๋ฐํ๋๋ค.
- ๋ค์ minor GC ๋, Eden space์์๋ ๊ฐ์ ์ผ์ด ์ผ์ด๋๋ค. ๋น ์ฐธ์กฐ ๊ฐ์ฒด๋ ์ญ์ ๋๊ณ ์ฐธ์กฐ ๊ฐ์ฒด๋ survivor space๋ก ์ด๋ํ๋ค.
- ๊ทธ๋ฌ๋ ์ด ์ผ์ด์ค์์ ์ฐธ์กฐ ๊ฐ์ฒด๋ ๋ ๋ฒ์งธ survivor space๋ก ์ด๋ํ๊ฒ ๋ฉ๋๋ค.
- ๊ฒ๋ค๊ฐ ์ต๊ทผ minor GC์์ ์ฒซ ๋ฒ์งธ survivor space๋ก ์ด๋๋ ๊ฐ์ฒด๋ค๋ age๊ฐ ์ฆ๊ฐํ๊ณ S1 ๊ณต๊ฐ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค.
- ํ๋ฒ ๋ชจ๋ surviving ๊ฐ์ฒด๋ค์ด S1์ผ๋ก ์ด๋ํ๊ฒ ๋๋ฉด S0์ Eden ๊ณต๊ฐ์ Clear ๋๋ค.
- ์ฃผ์ํด์ผํ ์ ์ ์ด์ ์ฐ๋ฆฌ๋ ๋ค๋ฅธ aged ๊ฐ์ฒด๋ค์ ์๋ฐ์ด๋ฒ ๊ณต๊ฐ์ ๊ฐ์ง๊ฒ ๋์๋ค๋ ๊ฒ์ด๋ค.
- ๋ค์ minor GC ๋, ๊ฐ์ ๊ณผ์ ์ด ๋ฐ๋ณต ๋ฉ๋๋ค.
- ๊ทธ๋ฌ๋ ์ด๋ฒ์ survivor space๋ค์ switch ๋๋ค.
- ์ฐธ์กฐ๋๋ ๊ฐ์ฒด๋ค์ S0๋ก ์ด๋ํ๋ค. ์ด์๋จ์ ๊ฐ์ฒด๋ค์ aged๋๊ณ Eden๊ณผ S1 ๊ณต๊ฐ์ Clear ๋ฉ๋๋ค.
- ์๋ ๊ทธ๋จ์ promotion์ ๋ณด์ฌ์ค๋ค.
- minor GC ํ aged ์ค๋ธ์ ํธ๋ค์ด ์ผ์ ํ age threshold(๋ฌธ์ง๋ฐฉ)์ ๋๊ฒ ๋๋ฉด ๊ทธ๋ค์ young generation์์ old๋ก promotion ๋๋ค.
- ์ฌ๊ธฐ์๋ 8์ ์๋ก ๋ค์๋ค.
- minor GC๊ฐ ๊ณ์๋๊ณ ๊ณ์ํด์ ๊ฐ์ฒด๋ค์ด Old Generation์ผ๋ก ์ด๋๋๋ค.
- ์๋ ๊ทธ๋ฆผ์ ์ ๊ณผ์ ์ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.
- ๊ฒฐ๊ตญ major GC๊ฐ old Generation์ ์ํ๋๊ณ , old Generation์ Clear ๋๊ณ , ๊ณต๊ฐ์ด Compact ๋์ด์ง๋ค.
Minor GC์ Major GC์ ์ฐจ์ด์
Minor GC๋ Eden ์์ญ์์ ์๋ก์ด ๊ฐ์ฒด์ ๋ํด ์๋์ด ๋๋ค. JVM์ด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด ๋ฐ์๋๋ GC์ด๋ค.
๋ฐ๋ฉด, Major GC๋ Tenured ์์ญ์์ ์๋์ด ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ Minor GC๊ฐ ๋ฐ์๋๊ณ ๊ทธ ๋ค์์ผ๋ก ๋ฐ์๋๋ค.
ํ๊ณ
- ์ด๋ค ๋ฐฉ์์ GC๋ฅผ ์ฌ์ฉํ๋ ์คํ ์๊ฐ์ ์์ ์ ํ๋ ์ด์ ์ฑ๋ฅ ํ๋ฝ์ ํผํ ์ ์๋ค.
- ์ฐ๋ ๊ธฐ ์์ง๊ธฐ๊ฐ ์กด์ฌํ๋๋ผ๋ ๋ ์ด์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด๋ง ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋ฐ์ํ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋์(memory leak) ํ์์ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ด ํ์ํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ์ ์ ํ๊ณ ์๋ ํ์์ด๋ค. ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ค์ ๋ฐํํ์ง ์๋ ๊ฒ์ด ๋์ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ญ๋น๋๋ค. ์ฆ, ๋ ์ด์ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ง ์์ผ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์๋ชป ๊ด๋ฆฌํ ๋ ๋ฐ์ํ๋ค.
์ฐธ๊ณ
'๐ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] Java SE, Java EE, Java ME (0) | 2021.08.18 |
---|---|
[Java] ๋ณ์์ scope์ static (0) | 2021.08.11 |
[Java] ๋๋ค์ (0) | 2021.08.10 |
[Java] ์คํธ๋ฆผ Stream (0) | 2021.07.28 |
[Java] ์ ๋ค๋ฆญ(Generic) (0) | 2021.07.28 |
๋๊ธ