written by sohyeon, hyemin π‘
μμ JVMμ€λͺ
μμ μΈκΈνλ―μ΄ GCλ λμ ν λΉλ λ©λͺ¨λ¦¬ μμ(heap)
μ€μμ λ μ΄μ μ¬μ©νμ§ μλ μμμ νμ§νμ¬ μλμΌλ‘ ν΄μ§
νλ κΈ°λ²μ΄λ€.
Javaμμλ κ°λ°μκ° νλ‘κ·Έλ¨ μ½λλ‘ λ©λͺ¨λ¦¬λ₯Ό λͺ
μμ μΌλ‘ ν΄μ νμ§ μκΈ° λλ¬Έμ κ°λΉμ§ 컬λ ν°(Garbage Collector)
κ° λ μ΄μ νμ μλ κ°μ²΄(μ°λ κΈ°)λ₯Ό μ°Ύμ μ§μ°λ μμ
μ νλ€.
GC μμ μ νλ κ°λΉμ§ μ½λ ν°(Garbage Collector)λ λ€μμ μν μ νλ€.
-
λ©λͺ¨λ¦¬ ν λΉ
-
μ¬μ© μ€μΈ λ©λͺ¨λ¦¬ μΈμ
-
μ¬μ©νμ§ μλ λ©λͺ¨λ¦¬μΈμ
GCλ₯Ό ν΄λ λμ΄μ μ¬μ© κ°λ₯ν λ©λͺ¨λ¦¬ μμμ΄ μλλ° κ³μ λ©λͺ¨λ¦¬λ₯Ό ν λΉνλ €κ³ νλ©΄,
OutOfMemoryErrorκ° λ°μνμ¬ WASκ° λ€μ΄λ μλ μλ€. ν(Hang) μ¦, μλ²κ° μμ²μ μ²λ¦¬ λͺ»νκ³ μλ μνκ° λλ€.
JVMμ λ©λͺ¨λ¦¬λ ν¬κ² ν΄λμ€ μμ, μλ° μ€ν, ν, λ€μ΄ν°λΈ λ©μλ μ€νμ 4κ° μμμΌλ‘ λλλλ°
κ°λΉμ§ μ½λ ν°
μμλ ν λ©λͺ¨λ¦¬
λ₯Ό λ€λ£¨κ² λλ€.
μ¦, μλ°μ½λ ν°κ° μΈμνκ³ ν λΉνλ μλ° λ©λͺ¨λ¦¬ μμμ ν μμμΈ κ²μ΄λ€.
κ°λΉμ§ 컬λ ν°λ λ κ°μ§ μ μ 쑰건 μλμμ λ§λ€μ΄ μ‘λ€.
- λλΆλΆμ κ°μ²΄λ κΈλ°© μ κ·Ό λΆκ°λ₯ μν(unreachable)κ° λλ€.
- μ€λλ κ°μ²΄μμ μ μ κ°μ²΄λ‘μ μ°Έμ‘°λ μμ£Ό μ κ² μ‘΄μ¬νλ€.
μ΄λ¬ν μ μ 쑰건(κ°μ€)μ 'weak generational hypothesis'λΌ νλ€.
μ΄ κ°μ€μ μ₯μ μ μ΅λν μ΄λ¦¬κΈ° μν΄μ HotSpot VMμμλ Young μμ
κ³Ό Old μμ
μΌλ‘ 물리μ μΈ κ³΅κ°μ λλμλ€.
-
Young μμ(Yong Generation μμ)
μλ‘κ² μμ±ν κ°μ²΄μ λλΆλΆμ΄ μ¬κΈ°μ μμΉνλ€. λλΆλΆμ κ°μ²΄κ° κΈλ°© μ κ·Ό λΆκ°λ₯ μνκ° λκΈ° λλ¬Έμ λ§€μ° λ§μ κ°μ²΄κ° Young μμμ μμ±λμλ€κ° μ¬λΌμ§λ€. μ΄ μμμμ κ°μ²΄κ° μ¬λΌμ§λ Minor GCκ° λ°μνλ€κ³ λ§νλ€. -
Old μμ(Old Generation μμ)
μ κ·Ό λΆκ°λ₯ μνλ‘ λμ§ μμ Young μμμμ μ΄μλ¨μ κ°μ²΄κ° μ¬κΈ°λ‘ 볡μ¬λλ€. λλΆλΆ Young μμλ³΄λ€ ν¬κ² ν λΉνλ©°, ν¬κΈ°κ° ν° λ§νΌ Young μμλ³΄λ€ GCλ μ κ² λ°μνλ€. μ΄ μμμμ κ°μ²΄κ° μ¬λΌμ§ λ Major GC(νΉμ Full GC)κ° λ°μνλ€κ³ λ§νλ€.
-
Permanent Generation μμ(μ΄ν Perm μμ, Method Area)
κ°μ²΄λ μ΅λ₯(intern)λ λ¬Έμμ΄ μ 보λ₯Ό μ μ₯νλ κ³³μ΄λ©°, Old μμμμ μ΄μλ¨μ κ°μ²΄κ° μμν λ¨μ μλ κ³³μ μλλ€.
μ΄ μμμμ GCκ° λ°μν μλ μλλ°, μ¬κΈ°μ GCκ° λ°μν΄λ Major GCμ νμμ ν¬ν¨λλ€. -
Old μμμ μλ κ°μ²΄κ° Young μμμ κ°μ²΄λ₯Ό μ°Έμ‘°νλ κ²½μ°
Old μμμλ 512λ°μ΄νΈμ λ©μ΄λ¦¬(chunk)λ‘ λμ΄ μλμΉ΄λ ν μ΄λΈ(card table)
μ΄ μ‘΄μ¬νλ€.
μΉ΄λ ν μ΄λΈμλ Old μμμ μλ κ°μ²΄κ° Young μμμ κ°μ²΄λ₯Ό μ°Έμ‘°ν λλ§λ€ μ λ³΄κ° νμλλ€.
Young μμμ GCλ₯Ό μ€νν λμλ Old μμμ μλ λͺ¨λ κ°μ²΄μ μ°Έμ‘°λ₯Ό νμΈνμ§ μκ³ ,
μ΄ μΉ΄λ ν μ΄λΈλ§ λ€μ Έμ GC λμμΈμ§ μλ³νλ€.
μΉ΄λ ν μ΄λΈμ write barrierλ₯Ό μ¬μ©νμ¬ κ΄λ¦¬νλ€. write barrierλ Minor GCλ₯Ό λΉ λ₯΄κ² ν μ μλλ‘ νλ μ₯μΉμ΄λ€. write barrirerλλ¬Έμ μ½κ°μ μ€λ²ν€λλ λ°μνμ§λ§ μ λ°μ μΈ GC μκ°μ μ€μ΄λ€κ² λλ€.
Young μμμ κ°μ²΄κ° μ μΌ λ¨Όμ μμ±λλ λΆλΆμΌλ‘ 3κ°μ μμμΌλ‘ λλλ€.
- Eden μμ
- Survivor μμ(2κ°)
Survivor μμμ΄ 2κ°μ΄κΈ° λλ¬Έμ μ΄ 3κ°μ μμμΌλ‘ λλλ κ²μ΄λ€.
κ° μμμ μ²λ¦¬ μ μ°¨λ₯Ό μμμ λ°λΌμ κΈ°μ νλ©΄ λ€μκ³Ό κ°λ€.
-
μλ‘ μμ±ν λλΆλΆμ κ°μ²΄λ Eden μμμ μμΉνλ€.
-
Eden μμμμ GCκ° ν λ² λ°μν ν μ΄μλ¨μ κ°μ²΄λ Survivor μμ μ€ νλλ‘ μ΄λλλ€.
-
Eden μμμμ GCκ° λ°μνλ©΄ μ΄λ―Έ μ΄μλ¨μ κ°μ²΄κ° μ‘΄μ¬νλ Survivor μμμΌλ‘ κ°μ²΄κ° κ³μ μμΈλ€.
-
νλμ Survivor μμμ΄ κ°λ μ°¨κ² λλ©΄ κ·Έ μ€μμ μ΄μλ¨μ κ°μ²΄λ₯Ό λ€λ₯Έ Survivor μμμΌλ‘ μ΄λνλ€.
κ·Έλ¦¬κ³ κ°λ μ°¬ Survivor μμμ μ무 λ°μ΄ν°λ μλ μνλ‘ λλ€. -
μ΄ κ³Όμ μ λ°λ³΅νλ€κ° κ³μν΄μ μ΄μλ¨μ μλ κ°μ²΄λ Old μμμΌλ‘ μ΄λνκ² λλ€.
-
μ΄ μ μ°¨λ₯Ό νμΈν΄ 보면 μκ² μ§λ§ Survivor μμ μ€ νλλ λ°λμ λΉμ΄ μλ μνλ‘ λ¨μ μμ΄μΌ νλ€.
λ§μ½ λ Survivor μμμ λͺ¨λ λ°μ΄ν°κ° μ‘΄μ¬νκ±°λ, λ μμ λͺ¨λ μ¬μ©λμ΄ 0μ΄λΌλ©΄
μ¬λ¬λΆμ μμ€ν μ μ μμ μΈ μν©μ΄ μλλΌκ³ μκ°νλ©΄ λλ€.
μ΄λ κ² Minor GCλ₯Ό ν΅ν΄μ Old μμκΉμ§ λ°μ΄ν°κ° μμΈ κ²μ κ°λ¨ν λνλ΄λ©΄ λ€μκ³Ό κ°λ€.
Old μμμ κΈ°λ³Έμ μΌλ‘ λ°μ΄ν°κ° κ°λ μ°¨λ©΄ GCλ₯Ό μ€ννλ€.
GC λ°©μμ λ°λΌμ μ²λ¦¬ μ μ°¨κ° λ¬λΌμ§λ―λ‘, μ΄λ€ GC λ°©μμ΄ μλμ§ μ΄ν΄λ³΄λ©΄ μ΄ν΄κ° μ¬μΈ κ²μ΄λ€.
GC λ°©μμ JDK 7μ κΈ°μ€μΌλ‘ 5κ°μ§ λ°©μμ΄ μλ€.
- Serial GC
- Parallel GC
- Parallel Old GC(Parallel Compacting GC)
- Concurrent Mark & Sweep GC(μ΄ν CMS)
- G1(Garbage First) GC
μ΄ μ€μμ μ΄μ μλ²μμ μ λ μ¬μ©νλ©΄ μ λλ λ°©μμ΄ Serial GCλ€.
Serial GCλ λ°μ€ν¬ν±μ CPU μ½μ΄κ° νλλ§ μμ λ μ¬μ©νκΈ° μν΄μ λ§λ λ°©μμ΄λ€.
Serial GCλ₯Ό μ¬μ©νλ©΄ μ ν리μΌμ΄μ
μ μ±λ₯μ΄ λ§μ΄ λ¨μ΄μ§λ€.
Old μμμ GCλ mark-sweep-compactμ΄λΌλ μκ³ λ¦¬μ¦μ μ¬μ©νλ€.
μ΄ μκ³ λ¦¬μ¦μ 첫 λ¨κ³λ Old μμμ μ΄μ μλ κ°μ²΄λ₯Ό μλ³(Mark)νλ κ²μ΄λ€.
κ·Έ λ€μμλ ν(heap)μ μ λΆλΆλΆν° νμΈνμ¬ μ΄μ μλ κ²λ§ λ¨κΈ΄λ€(Sweep).
λ§μ§λ§ λ¨κ³μμλ κ° κ°μ²΄λ€μ΄ μ°μλκ² μμ΄λλ‘ νμ κ°μ₯ μ λΆλΆλΆν° μ±μμ
κ°μ²΄κ° μ‘΄μ¬νλ λΆλΆκ³Ό κ°μ²΄κ° μλ λΆλΆμΌλ‘ λλλ€(Compaction).
Serial GCλ μ μ λ©λͺ¨λ¦¬μ CPU μ½μ΄ κ°μκ° μ μ λ μ ν©ν λ°©μμ΄λ€.
Parallel GCλ Serial GCμ κΈ°λ³Έμ μΈ μκ³ λ¦¬μ¦μ κ°μ§λ€.
κ·Έλ¬λ Serial GCλ GCλ₯Ό μ²λ¦¬νλ μ€λ λκ° νλμΈ κ²μ λΉν΄, Parallel GCλ GCλ₯Ό μ²λ¦¬νλ μ°λ λκ° μ¬λ¬ κ°μ΄λ€.
κ·Έλ κΈ° λλ¬Έμ Serial GCλ³΄λ€ λΉ λ₯Έκ² κ°μ²΄λ₯Ό μ²λ¦¬ν μ μλ€.
Parallel GCλ λ©λͺ¨λ¦¬κ° μΆ©λΆνκ³ μ½μ΄μ κ°μκ° λ§μ λ μ 리νλ€.
Parallel GCλ Throughput GCλΌκ³ λ λΆλ₯Έλ€.
Parallel Old GCλ JDK 5 update 6λΆν° μ 곡ν GC λ°©μμ΄λ€.
μμ μ€λͺ
ν Parallel GCμ λΉκ΅νμ¬ Old μμμ GC μκ³ λ¦¬μ¦λ§ λ€λ₯΄λ€.
μ΄ λ°©μμ Mark-Summary-Compaction λ¨κ³λ₯Ό κ±°μΉλ€.
Summary λ¨κ³λ μμ GCλ₯Ό μνν μμμ λν΄μ λ³λλ‘ μ΄μ μλ κ°μ²΄λ₯Ό μλ³νλ€λ μ μμ
Mark-Sweep-Compaction μκ³ λ¦¬μ¦μ Sweep λ¨κ³μ λ€λ₯΄λ©°, μ½κ° λ 볡μ‘ν λ¨κ³λ₯Ό κ±°μΉλ€.
CMS GCλ μ§κΈκΉμ§ μ€λͺ
ν GC λ°©μλ³΄λ€ λ 볡μ‘νλ€.
μ΄κΈ° Initial Mark λ¨κ³μμλ ν΄λμ€ λ‘λμμ κ°μ₯ κ°κΉμ΄ κ°μ²΄ μ€ μ΄μ μλ κ°μ²΄λ§ μ°Ύλ κ²μΌλ‘ λλΈλ€.
λ°λΌμ, λ©μΆλ μκ°μ λ§€μ° μ§§λ€. κ·Έλ¦¬κ³ Concurrent Mark λ¨κ³μμλ λ°©κΈ μ΄μμλ€κ³ νμΈν κ°μ²΄μμ μ°Έμ‘°νκ³ μλ κ°μ²΄λ€μ λ°λΌκ°λ©΄μ νμΈνλ€. μ΄ λ¨κ³μ νΉμ§μ λ€λ₯Έ μ€λ λκ° μ€ν μ€μΈ μνμμ λμμ μ§νλλ€λ κ²μ΄λ€.
κ·Έ λ€μ Remark λ¨κ³μμλ Concurrent Mark λ¨κ³μμ μλ‘ μΆκ°λκ±°λ μ°Έμ‘°κ° λκΈ΄ κ°μ²΄λ₯Ό νμΈνλ€.
λ§μ§λ§μΌλ‘ Concurrent Sweep λ¨κ³μμλ μ°λ κΈ°λ₯Ό μ 리νλ μμ
μ μ€ννλ€.
μ΄ μμ
λ λ€λ₯Έ μ€λ λκ° μ€νλκ³ μλ μν©μμ μ§ννλ€.
μ΄λ¬ν λ¨κ³λ‘ μ§νλλ GC λ°©μμ΄κΈ° λλ¬Έμ stop-the-world μκ°μ΄ λ§€μ° μ§§λ€.
λͺ¨λ μ ν리μΌμ΄μ
μ μλ΅ μλκ° λ§€μ° μ€μν λ CMS GCλ₯Ό μ¬μ©νλ©°, Low Latency GCλΌκ³ λ λΆλ₯Έλ€.
κ·Έλ°λ° CMS GCλ stop-the-world μκ°μ΄ 짧λ€λ μ₯μ μ λ°ν΄ λ€μκ³Ό κ°μ λ¨μ μ΄ μ‘΄μ¬νλ€.
- λ€λ₯Έ GC λ°©μλ³΄λ€ λ©λͺ¨λ¦¬μ CPUλ₯Ό λ λ§μ΄ μ¬μ©νλ€.
- Compaction λ¨κ³κ° κΈ°λ³Έμ μΌλ‘ μ 곡λμ§ μλλ€.
λ°λΌμ, CMS GCλ₯Ό μ¬μ©ν λμλ μ μ€ν κ²ν ν νμ μ¬μ©ν΄μΌ νλ€.
κ·Έλ¦¬κ³ μ‘°κ°λ λ©λͺ¨λ¦¬κ° λ§μ Compaction μμ
μ μ€ννλ©΄ λ€λ₯Έ GC λ°©μμ stop-the-world μκ°λ³΄λ€
stop-the-world μκ°μ΄ λ κΈΈκΈ° λλ¬Έμ Compaction μμ
μ΄ μΌλ§λ μμ£Ό, μ€λ«λμ μνλλμ§ νμΈν΄μΌ νλ€.
λ€μ κ·Έλ¦Όμμ 보λ€μνΌ, G1 GCλ λ°λνμ κ° μμμ κ°μ²΄λ₯Ό ν λΉνκ³ GCλ₯Ό μ€ννλ€.
κ·Έλ¬λ€κ°, ν΄λΉ μμμ΄ κ½ μ°¨λ©΄ λ€λ₯Έ μμμμ κ°μ²΄λ₯Ό ν λΉνκ³ GCλ₯Ό μ€ννλ€.
μ¦, μ§κΈκΉμ§ μ€λͺ
ν Youngμ μΈκ°μ§ μμμμ λ°μ΄ν°κ° Old μμμΌλ‘ μ΄λνλ λ¨κ³κ° μ¬λΌμ§ GC λ°©μμ΄λΌκ³ μ΄ν΄νλ©΄ λλ€.
G1 GCλ CMS GCλ₯Ό λ체νκΈ° μν΄μ λ§λ€μ΄ μ‘λ€. G1 GCμ κ°μ₯ ν° μ₯μ μ μ±λ₯μ΄λ€. μ§κΈκΉμ§ μ€λͺ
ν μ΄λ€ GC λ°©μ보λ€λ λΉ λ₯΄λ€.
- Javaμ μ μ - λμ°μΆν
- https://d2.naver.com/helloworld/1329
- https://12bme.tistory.com/57