[Java] Java GC μ½κ² μ΄ν΄νκΈ°
βπ» λ€μ΄κ°λ©°..
κΈ°μ‘΄μλ μ± λ΄μ©μ κ·Έλλ‘ μμ±νκ³ (κ±°μ νμ¬μμ€,,) λ μμ μ΄ μ΄ν΄νκΈ° μν΄μ λΈλ‘κ·Έ κΈμ μμ±νλ€λ©΄, μ΄μ λ λ¨μκ² μ€λͺ νλ―μ΄ λΈλ‘κ·Έ κΈμ μμ±νλ € ν©λλ€. μ΄μ κΈλ€κ³Ό μμ λ°©μμ΄ λ€λ₯Ό μ μμ΅λλ€.
GCλ
μ°λ¦¬λ Java νλ‘κ·Έλλ°μ νλ©΄μ new
λΌλ ν€μλλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μμ±ν©λλ€. μ΄ λ new
κ° λΆμ κ°μ²΄λ Heap μμμ λμ μΌλ‘ λ©λͺ¨λ¦¬λ₯Ό ν λΉν΄μ€λλ€. μ΄λ κ² λμ μΌλ‘ ν λΉλ λ©λͺ¨λ¦¬λ λ μ΄μ μ¬μ©νμ§ μμΌλ©΄ ν΄μ λμ΄μΌ ν©λλ€. ν΄μ νμ§ μμΌλ©΄ λ©λͺ¨λ¦¬λ₯Ό κ³μν΄μ μ μ νκ³ μμΌλ―λ‘ OutOfMemmory Exception
μ΄ λ°μν μ μμ΅λλ€.
μ΄λ κ² λμ μΌλ‘ ν λΉλ λ©λͺ¨λ¦¬λ₯Ό ν΄μ ν΄μ£Όλ μμ μ νλ κ²μ΄ GCμ λλ€. μ 리νμλ©΄ λ€μκ³Ό κ°μ΅λλ€.
GCλ Garbage Collection(μ΄ν GC)μ μ½μλ‘ λ μ΄μ μ¬μ©νμ§ μλ(μ°λ κΈ°) κ°μ²΄λ₯Ό μ°Ύμ μ§μ°λ μμ μ νλ€.
Javaλ GCκ° λ©λͺ¨λ¦¬λ₯Ό μλμΌλ‘ κ΄λ¦¬ν΄μ€λλ€. λ§μ½ GCκ° μμλ€λ©΄ κ°λ°μκ° μλμΌλ‘ μ¬μ©νμ§ μλ λ©λͺ¨λ¦¬λ₯Ό 체ν¬νκ³ λ°ννλ μΌμ μνν΄μΌ ν©λλ€.
μκ°λ§ ν΄λ λ²κ±°λ‘μ΅λλ€. μλμΌλ‘ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬νλ€λ κ²μ΄ μ΄λ€ κ΄μ μμ 보면 λΉν¨μ¨μ μ΄μ΄ λ³΄μΌ μλ μμ§λ§, κ°λ°μ μ μ₯μμ κ°λ°μ μ§μ€ν μ μλ νκ²½μ λ§λ€μ΄ μ€λ€λ μ₯μ μ΄ μμ΅λλ€.
π‘ Javaμμλ GCλ₯Ό κ°λ°μκ° μ§μ νΈμΆνλ λ°©λ²λ μμ΅λλ€. λ°λ‘ System.gc() λ©μλ μ λλ€. νμ§λ§ ν΄λΉ λ©μλλ μμ€ν μ μ±λ₯μ ν° μν₯μ λ―ΈμΉλ―λ‘ μ λ νΈμΆν΄μλ μλ©λλ€. κ·Έλ₯ GCκ° μμμ λμνλλ‘ λλλ κ²μ΄ μ μΌ λ² μ€νΈμ λλ€.
Stop-the-world
stop-the-worldλ, GCλ₯Ό μ€ννκΈ° μν΄ JVMμ΄ μ΄ν리μΌμ΄μ
μ μ€νμ λ©μΆλ κ² μ
λλ€. GCλ₯Ό μννλ λ©μλλ₯Ό μ μΈν λͺ¨λ μ°λ λκ° μΌμμ μΌλ‘ μ μ§λλ©°, GCκ° λλ λ€μμΌ μ μ§λλ μ°λ λκ° μ μμ μΌλ‘ λμν©λλ€.
μ΄λ ν μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ GCλ₯Ό μννλ Stop-and-world μνλ₯Ό λ§μ΄νκ² λ©λλ€. GC νλμ΄λΌνλ©΄ μ΄μ κ°μ μ°λ λμ μμ μ΄ λ©μΆλ μκ°(Stop-and-world)μ μ΅μνμΌλ‘ μ€μ΄λ κ²μ΄λΌκ³ 보면 λ©λλ€.
Reachability
Java μ GCλ Reachability
μ κ°λ
μ μμμΌν©λλ€. μ΄λ ν κ°μ²΄μ μ ν¨ν μ°Έμ‘°κ° μλ€λ©΄ reachable
μ΄λΌνκ³ , μ ν¨ν μ°Έμ‘°κ° μλ€λ©΄ unreachable
μ΄λΌ ν©λλ€.
GCμλ GC rootκ° μ‘΄μ¬ν©λλ€. GC rootλ λ§ κ·Έλλ‘ GCμ λΏλ¦¬λΌκ³ μ΄ν΄νλ©΄ λ©λλ€.
β GC rootκ° λλ 쑰건
1. stack μμμ λ°μ΄ν°(μ§μλ³μ, νλΌλ―Έν° λ±)
2. method μμμ static λ°μ΄ν°
3. μ€νμ€μΈ μ°λ λ
4. JNI (Java Native Interface)μ μν΄ μμ±λ κ°μ²΄
μμ μ¬μ§μμ 보μ΄λ κ² μ²λΌ GC Rootμ μ°κ²°λ κ°μ²΄λ reachable
κ·Έ μΈλ unreachable
μ΄λΌκ³ ν©λλ€. μλμ κ·Έλ¦Όμ ν΅ν΄ μ΄ν΄λ₯Ό λμ보λλ‘ νκ² μ΅λλ€.
μμ μ¬μ§μμ 1,3,4,5 λ reachable
ν μνμ
λλ€.
- 1,5 λ Stack μμμ μλ 6, 7μ μ°Έμ‘°νκ³ μμ΅λλ€.
- 3 μ Method Area μμμ μλ 8μ μ°Έμ‘°νκ³ μμ΅λλ€.
- 4 λ 7μ μ°Έμ‘°νκ³ μλ 5λ₯Ό μ°Έμ‘°νκ³ μμ΅λλ€.
unreachable
ν 2 λ μ무κ²λ μ°Έμ‘°νκ³ μμ§ μμ΅λλ€. μ¦, GCμ μκ±° λμμ΄ λ©λλ€.
π€·βοΈ κ·ΈλΌ GCμ μ΄λ€ μκ³ λ¦¬μ¦μ μν΄ λμνμ§?
λ°λ‘ Mark and Sweep
μ΄λΌλ μκ³ λ¦¬μ¦μΌλ‘ λμν©λλ€.
GC rootμμ μμνμ¬ rootκ° μ°Έμ‘°νλ λͺ¨λ κ°μ²΄ λλ κ·Έ κ°μ²΄λ€μ΄ μ°Έμ‘°νλ λ€λ₯Έ κ°μ²΄λ€μ νμνλ©° λ§ν¬(Mark)ν©λλ€. μ΄ κ³Όμ μ΄ Mark and Sweep
μκ³ λ¦¬μ¦μ Mark
μ ν΄λΉν©λλ€.
[μ°Έμ‘°λ κ°μ²΄ : νλμ / μ°Έμ‘°λμ§ μμ κ°μ²΄ : λ
Έλμ]
Mark
κ° λλλ©΄ GCλ λ§ν¬(Mark)λμ§ μμ λ©λͺ¨λ¦¬λ€μ ν΄μ ν©λλ€. μ΄ κ³Όμ μ Sweep
μ΄λΌκ³ ν©λλ€.
[μ°Έμ‘°λκ³ μμ§ μμ κ°μ²΄λ₯Ό μμ ν νμ κ·Έλ¦Όμ
λλ€. ]
Mark and Sweep
μκ³ λ¦¬μ¦ λΏλ§ μλλΌ compact
λΌλ μκ³ λ¦¬μ¦λ μμ΅λλ€. compact
λ Mark and Sweep
κ³Όμ μ κ±°μΉκ³ λλ©΄ Mark λμ§ μμ κ°μ²΄λ€λ§ λ¨μμμ κ² μ
λλ€. κ·Έλ¬λ©΄ κ°μ²΄λ€μ΄ λ¬μ±λ¬μ± μ‘΄μ¬νκ² μ£ ? μ΄λ¬ν κ°μ²΄λ€μ μμΆ, μ¦ ν κ³³μΌλ‘ λͺ¨μμ λ©λͺ¨λ¦¬ λ¨νΈνλ₯Ό λ§μ΅λλ€. compact
κ³Όμ μ ν΅ν΄ μ λ©λͺ¨λ¦¬ ν λΉμ΄ μ½κ³ , λΉ¨λΌμ§λλ‘ ν©λλ€.
[Sweep κ³Όμ ν λ¬μ±λ¬μ± μ‘΄μ¬νλ μ°Έμ‘°λ κ°μ²΄ μμΆν λͺ¨μ΅]
π κ·Έλμ μ μκ³ λ¦¬μ¦μ΄ μΈμ λμνλλ°?
GCλ Heap μμμ λμ μΌλ‘ ν λΉλ λ©λͺ¨λ¦¬ μ€ λ μ΄μ μ¬μ©νμ§ μλ λ©λͺ¨λ¦¬λ₯Ό μλμΌλ‘ ν΄μ ν΄μ€λ€κ³ νμ΅λλ€.
Heap μμμ λν΄ μμ보λλ‘ νμ£ . Heap μμμ μλμ μ¬μ§κ³Ό κ°μ΄ λλ©λλ€.
- Young Generation : μ μ κ°μ²΄
- eden : κ°μ²΄λ₯Ό μμ±νμλ§μ μ μ₯λλ μ₯μ
- Survivor Space 0 : κ°μμ 0
- Survivor Space 1 : κ°μμ 2
- Old Generation : μ€λλ κ°μ²΄
- Parameter Generation
ν¬κ² Young Generation
, Old Generation
, Parameter Generation
μΌλ‘ λλλ©° Young Generation
μ eden
, Survivor Space 0
, Survivor Space 1
λ‘ λ λλ©λλ€.
Heap μμ λ©λͺ¨λ¦¬κ° μ΄λ»κ² λλλμ§ μ΄ν΄λ΄€μΌλ μ΄μ Heap μμμ κ°μ²΄κ° μμ±λκ³ GCκ° μΌμ΄λλ κ³Όμ μ μ΄ν΄λ³΄λλ‘ νκ² μ΅λλ€. μ°λ¦¬κ° κ°μ²΄λ₯Ό μμ±νμλ§μ μ μ₯λλ μ₯μλ Eden μμμ λλ€.
- Eden μμμ κ°μ²΄κ° μμ±λ©λλ€.
- Eden μμμ΄ κ½ μ°¨λ©΄ Minor GC(λ§μ΄λ GC)κ° λ°μ(Mark-and-Sweep)ν©λλ€.
- μ΄μμλ κ°μ²΄λ§ Survivor 0 μμμΌλ‘ 볡μ¬λκ³ ,
λ€μ Eden μμμ μ±μ°κ² λ©λλ€.
- Survivor 0 μμμ΄ κ½ μ°¨κ² λλ©΄ Survivor 1 μμμΌλ‘ κ°μ²΄κ° 볡μ¬λ©λλ€.
μ΄ λ, Eden μμμ μλ κ°μ²΄λ€ μ€ μ΄μμλ κ°μ²΄λ€λ Survivor 1 μμμΌλ‘ κ°λλ€. μ¦, Survivor 0 λλ 1 λ μ€ νλλ λ°λμ λΉμμ Έ μμ΄μΌ ν©λλ€.
- 1~4κ° λ°λ³΅λ λλ§λ€ μ΄μμλ κ°μ²΄λ ageκ°μ΄ μ¦κ°ν©λλ€.
μΌμ μμ€μ ageκ°μ λλ¬νλ©΄ Young Generationμμ Old GenerationμΌλ‘ μ΄λν©λλ€.
- 1~5κ° λ°λ³΅νλ€λ³΄λ©΄ Old Generationλ κ½ μ°¨κ² λ©λλ€. μ΄ λ major GC(λ©μ΄μ GC) κ° λ°μνκ² λ©λλ€. (Full GC λΌκ³ λ λΆλ¦°λ€.)
μμ κ³Όμ μ μ¬μ§μ ν΅ν΄ μ΄ν΄ν΄ 보λλ‘ νκ² μ΅λλ€.
μμ μ¬μ§μ 1~4 κΉμ§μ κ³Όμ μ λλ€. μμ κ³Όμ μ λ°λ³΅νλ©° μ€λλ κ°μ²΄(ageκ°μΌλ‘ νλ¨)λ Old GenerationμΌλ‘ μ΄λνκ² λ©λλ€. (μλμ μ¬μ§ μ°Έκ³ )
κ·Έλ κ² Old GenerationκΉμ§ κ½μ°¨λ©΄ λ©μ΄μ GCκ° λ°μνκ² λλ κ² μ λλ€.
π‘ minor GC vs major GC λκ° λ λΉ λ₯ΌκΉ?
--> λ΅μ minor GC!!
μ΄μ λ μΌλ°μ μΌλ‘ λ μμ 곡κ°μ΄ ν λΉλκ³ , κ°μ²΄λ€μ μ²λ¦¬νλ λ°©μλ λ€λ₯΄κΈ° λλ¬Έμ
λλ€.
π€·βοΈ μ GCλ₯Ό λλλμ..
κ·Έλ₯ ν λ²μ GCλ₯Ό μ§ννλ©΄ λ κ²μ μ λλμμκΉμ?
GC μ€κ³μλ€μ λ κ°μ§μ κ°μ€μ μ μ¬νκ³ GCλ₯Ό λ§λ€μμ΅λλ€.
- λλΆλΆμ κ°μ²΄λ κΈλ°© μ κ·Ό λΆκ°λ₯ν μν(unreachable)κ° λλ€. μ¦, κΈλ°© garbageκ° λλ€.
- μ€λλ κ°μ²΄μμ μ μ κ°μ²΄λ‘μ μ°Έμ‘°λ μμ£Ό μ κ² μ‘΄μ¬νλ€.
κ·Έλ¦¬κ³ , oracle μ¬μ΄νΈμ μλ GCμ κΈ°λ³Έμ¬νμ 보면 λ€μκ³Ό κ°μ΄ μ νμ Έ μμ΅λλ€.
JVMμ λͺ¨λ κ°μ²΄λ₯Ό νμνκ³ μμΆν΄μΌ νλ κ²μ λΉν¨μ¨μ μ λλ€. λ λ§μ κ°μ²΄κ° ν λΉλ¨μ λ°λΌ κ°μ²΄ λͺ©λ‘μ΄ λμ΄λκ³ κ°λΉμ§ μμ§ μκ°μ΄ μ μ λ κΈΈμ΄μ§λλ€. κ·Έλ¬λ μμ© νλ‘κ·Έλ¨μ λν κ²½νμ λΆμμ λ°λ₯΄λ©΄ λλΆλΆμ κ°μ²΄λ μλͺ μ΄ μ§§μ΅λλ€.
μμ μ΄λ €μ΄ λ΄μ©μ ν μ€λ‘ μμ½νμλ©΄, κΈλ°© garbageκ° λμ΄μ GCμ λμμ΄ λλ ν λ²μ νλ κ² λ³΄λ€ μΈλλ³λ‘ λλμ΄μ GCλ₯Ό μννλ κ²μ΄ λ ν¨μ¨μ μ΄λΌλ λ§ μ λλ€.
μ΄λ² κΈμμ GCμ μ’ λ₯κΉμ§ λ€λ£° μκ°μ΄μμ§λ§, μκ°λ³΄λ€ κΈμ΄ κΈΈμ΄μ Έ GCμ μ’ λ₯μ λν΄μλ λ€μ κΈμμ λ€λ£¨κ² μ΅λλ€.
λ§μ§λ§ νλ§λ..
곡μλ¬Έμλ₯Ό 보λ λ²μ μμ£Ό μ¬μμμμ§ μ κ² κ°μ΅λλ€. λ€λ₯Έ λΈλ‘κ·Έλ₯Ό μ°Έκ³ νλ κ² λ³΄λ€ κ³΅μλ¬Έμλ₯Ό λ³΄κ³ μ΄ν΄νλ κ²μ΄ λ μ¬μ μ΅λλ€. λ¬Όλ‘ μ νλΈλ₯Ό 보며 μ΄ν΄λ₯Ό λμμ΅λλ€ γ γ
References