Garbege Collector
κ°λΉμ§ κ°μ²΄ μ μ
Java GC λ κ°μ²΄κ° κ°λΉμ§ κ°μ²΄μΈμ§ νλ³νκΈ° μν΄μ reachability
λΌλ κ°λ
μ μ¬μ©νλ€.
μ΄λ μ ν¨ν μ°Έμ‘°κ° μμΌλ©΄ reachable
λ‘, μμΌλ©΄ unreachable
λ‘ κ΅¬λ³νκ³ unreachable
κ°μ²΄λ₯Ό κ°λΉμ§λ‘ κ°μ£Όνμ¬ GC λ₯Ό μννλ€.
μλ‘ μ°Έμ‘°νκ³ μλ κ°μ²΄λ€μ μ°Έμ‘° μ¬μ¬ μ΄λΌκ³ νλ©° μ΅μ‘°μ μ°Έμ‘°κ° μ΄λ£¨μ΄μ Έ μλ κ°μ²΄μ μ°Έμ‘°λ₯Ό Root Set
μ΄λΌκ³ νλ€.
μλλ λ°νμ λ°μ΄ν° μμμ ꡬ쑰μ΄λ€.
Reachability
Heap μμμ μλ κ°μ²΄λ€μ λν μ°Έμ‘°λ λ€μ 4κ°μ§μ€μ νλμ΄λ€.
- Heap μμ λ΄μ μλ λ€λ₯Έ κ°μ²΄μ μν μ°Έμ‘°
- Java Stack (Java Method μ€νμ μ¬μ©νλ μ§μλ³μ λ° νλΌλ©ν°λ€μ μν μ°Έμ‘°)
- Native Stack (JNIμ μν΄ μμ±λ κ°μ²΄μ λν μ°Έμ‘°)
- λ©μλ μμμ μ μ λ³μμ μν μ°Έμ‘°
μ΄λ€ μ€ Heap λ΄μ λ€λ₯Έ κ°μ²΄μ μν μ°Έμ‘°λ₯Ό μ μΈν λλ¨Έμ§ 3κ°κ° Root Set
μ΄ λλ―λ‘ reachability
κ°μ²΄λ₯Ό νκ°λ¦ νλ κΈ°μ€μ΄ λλ€.
μ΄λ₯Ό μ μ©ν ꡬμ±μ λ€μκ³Ό κ°λ€.
Root Set
μμ μμν μ°Έμ‘° μ¬μ¬μ μν κ°μ²΄λ€μ reachable
κ°μ²΄μ΄κ³ μ΄μ 무κ΄ν κ°μ²΄λ€μ unreachable
κ°μ²΄λ‘ GC λμμ΄λ€.
μ€λ₯Έμͺ½ μλ κ°μ²΄μ²λΌ reachable
κ°μ²΄λ₯Ό μ°Έμ‘°νλλΌλ, λ€λ₯Έ reachable κ°μ²΄κ° μ΄ κ°μ²΄λ₯Ό μ°Έμ‘°νμ§ μλλ€λ©΄ μ΄ κ°μ²΄λ unreachable
κ°μ²΄μ΄λ€. (μ΄ κ·Έλ¦Όμμ μ°Έμ‘°λ λͺ¨λ java.lang.ref ν¨ν€μ§λ₯Ό μ¬μ©νμ§ μμ μΌλ°μ μΈ μ°Έμ‘°μ΄λ€.)
μ ꡬμ±μ strong reference λΌ λΆλ₯Έλ€.
Reference Object
java.lang.ref
λ soft, weak, phantom reference λ₯Ό ν΄λμ€ ννλ‘ μ 곡νλ€.
java.lang.ref.WeakReference
ν΄λμ€λ μ°Έμ‘° λμμΈ κ°μ²΄λ₯Ό μΊ‘μνν WeakReference κ°μ²΄λ₯Ό μμ±νλ€.
μ΄λ κ² μμ±ν κ°μ²΄λ Java GC μ λ³λ κ΄λ¦¬ λμμ΄ λλ€. (μΊ‘μνλ λ΄λΆ κ°μ²΄λ weak reference μ μν΄ μ°Έμ‘°λλ€.)
WeakReference<Sample> wr = new WeakReference<Sample>(new Sample());
Sample ex = wr.get();
μ μ½λμμ WeakReference
ν΄λμ€μ κ°μ²΄λ new
λ©μλλ‘ μμ±λ Sample
κ°μ²΄λ₯Ό μΊ‘μνν κ°μ²΄μ΄λ€.
μ°Έμ‘°λ Sample
κ°μ²΄λ λλ²μ§Έ μ€μμ get
λ©μλμ μν΄ λ€λ₯Έ μ°Έμ‘°μ λμ
λλ€.
μ΄ μμ μμ WeakReference κ°μ²΄ λ΄μ μ°Έμ‘°μ ex μ°Έμ‘°κ° Sample κ°μ²΄λ₯Ό κ°λ₯΄ν¨λ€.
ex = null;
μ μ½λμ κ°μ΄ ex μ°Έμ‘°μ null μ λμ νλ©΄ μ²μ μμ±ν Sample κ°μ²΄λ μ€μ§ WeakReference λ΄λΆμμλ§ μ°Έμ‘°λλ€.
μ΄λ₯Ό weakly reachable μν κ°μ²΄ λΌκ³ νλ€.
Reference Object
Java μ€ν©μμSoftReference
,WeakReference
,PhantomReference
3κ°μ§ ν΄λμ€λ‘ μμ±λ κ°μ²΄λ₯Ό λ§νλ€.
Reference Object μ μν΄ μ°Έμ‘°λ κ°μ²΄λ₯Ό referent λΌκ³ νλ€.
Referenceμ Reachability
μμμ GC λμμ¬λΆλ₯Ό reachable
, unreachable
λ‘ κ΅¬λΆνμμΌλ©°
java.lang.ref
ν¨ν€μ§λ₯Ό μ΄μ©νμ¬ GC λμ λμμ λ€λ₯΄κ² μ§μ κ°λ₯νκ²λ κ°μ
ν μ μλ€.
μ΄λ₯Ό λ€μκ³Ό κ°μ΄ νν κ°λ₯νλ€.
- νλ : Strongly Reachable Object
- λ Ήμ : Weakly Reachable Object (GC λμ)
- λΉ¨κ° : Unreachable Object (GC λμ)
μ κ·Έλ¦Όμμ WeakReference
κ°μ²΄ μ체λ weakly reachable
κ°μ²΄κ° μλλΌ strongly reachable
κ°μ²΄μ΄λ€.
λν WeakReference
μ μν΄ μ°Έμ‘°λκ³ μμΌλ©΄μ λμμ root set μμ μμν μ°Έμ‘°μ¬μ¬μ ν¬ν¨λμ΄ μλ κ²½μ° weakly reachable
κ°μ²΄κ° μλλΌ strongly reachable
κ°μ²΄μ΄λ€.
GCκ° λμνμ¬ μ΄λ€ κ°μ²΄λ₯Ό weakly reachable
κ°μ²΄λ‘ νλͺ
νλ©΄,
GCλ WeakReference
κ°μ²΄μ μλ weakly reachable
κ°μ²΄μ λν μ°Έμ‘°λ₯Ό null
λ‘ μ€μ νλ€.
μ΄μ λ°λΌ weakly reachable
κ°μ²΄λ unreachable
κ°μ²΄μ λ§μ°¬κ°μ§ μνκ° λκ³ ,
κ°λΉμ§λ‘ νλͺ
λ λ€λ₯Έ κ°μ²΄λ€κ³Ό ν¨κ» λ©λͺ¨λ¦¬ νμ λμμ΄ λλ€.
Strengths of Reachability
Java GC λ μμμ λ§ν κ·Όκ±°λ₯Ό λ°νμΌλ‘ λ€μ 5κ°μ§μ Reachability λ₯Ό κ²°μ νλ€.
- Strongly Reachable
- root set μΌλ‘ λΆν° μμν΄μ μ΄λ€ reference object λ μ€κ°μ λΌμ΄ μμ§ μλ μν
- κ°μ²΄κΉμ§ λλ¬νλ μ¬λ¬ μ°Έμ‘°μ¬μ¬μ€μ reference object κ° νλλΌλ μλ κ°μ²΄
- Softly Reachable
- Strongly Reachable κ°μ²΄κ° μλ κ°μ²΄μ€μ weak reference, phantom reference μμ΄ sort reference κ° νλλΌλ μλ κ°μ²΄
- Weakly Reachable
- Strongly Reachable λ Softly Reachable κ°μ²΄λ μλ κ°μ²΄μ€μμ phantom reference μμ΄ weak reference λ§ ν΅κ³Όνλ μ°Έμ‘° μ¬μ¬μ΄ νλλΌλ μλ κ°μ²΄
- Phantomly Reachable
- Strongly Reachable λ Softly Reachable, Weakly Reachable κ°μ²΄ λͺ¨λ ν΄λΉλμ§ μλ κ°μ²΄
- finalize λμμ§λ§ μμ§ λ©λͺ¨λ¦¬κ° νμλμ§ μλ μν
- Unreachable
- root set μΌλ‘ λΆν° μμλλ μ°Έμ‘° μ¬μ¬μ΄ μ°Έμ‘°λμ§ μλ μν
μλ μμμ κ°μ²΄ B λ Softly Reachable μ΄λ€.
μ°Έκ³ μλ£
μμ ꡬμ±
GC λ₯Ό μ€ννκΈ° μν΄ stop-the-world
μ μ΄μ©νμ¬ λͺ¨λ μ ν리μΌμ΄μ
μμ
μ λ©μΆλ€.
μ΄ stop-the-world
λ₯Ό μ€ννλ©΄ GC λ₯Ό μ€ννλ thread
λ₯Ό μ μΈν λλ¨Έμ§ thread
λ λͺ¨λ μμ
μ λ©μΆλ€.
GC μμ μ μλ£ν μ΄νμλ μ€λ¨λ¬λ μμ μ λ€μ μμνλ€.
JAVA νλ‘κ·Έλ¨ μ½λμμλ λ©λͺ¨λ¦¬λ₯Ό λͺ
μμ μΌλ‘ μ§μ νμ¬ ν΄μ νμ§ μλλ€.
μ΄λ Garbage Collector
μν΄ λ μ΄μ νμμλ κ°μ²΄λ₯Ό μ°Ύμ μ§μ°λ μμ
μ νλ€.
μ΄ Garbage Collector
μ μ€κ³ μμΉμ weak generational hypothesis
μ΄λΌκ³ νλλ° μ΄ μμΉμ λ€μκ³Ό κ°λ€.
- λλΆλΆμ κ°μ²΄λ κΈλ°© μ κ·Ό λΆκ°λ₯ν μν (unreachable) μνκ° λλ€.
- μ€λλ κ°μ²΄μμ μ μ κ°μ²΄λ‘μμ μ°Έμ‘°λ κ·Ήν λλ¬Όλ€.
μ λ κ°μ€μ κΈ°λ°μΌλ‘ν HotSpot VM
μμλ ν¬κ² 2κ°μ 물리μ 곡κ°μ λλμλ€.
λ°λ‘ μλμ κ°μ Old Generation Area
, Young Generation Area
μ΄λ€.
Young Generation Area
- μλ‘κ² μμ±ν κ°μ²΄κ° μμΉνλ 곡κ°
- λλΆλΆμ κ°μ²΄κ° κΈλ°© μ κ·Ό λΆκ° μνκ° λκΈ° λλ¬Έμ λ§μ κ°μ²΄κ° Young μμ μμ±λμλ€κ° μ¬λΌμ§λ€
- μ΄ μμμμ κ°μ²΄κ° μ¬λΌμ§λ
Minor GC
κ° λ°μνλ€.
Old Generation Area
- μ κ·Ό λΆκ°λ₯ μνλ‘ λμ§ μμ Young μμμμ μ΄μλ¨μ κ°μ²΄κ° μ¬κΈ°λ‘ 볡μ¬λλ€.
- λλΆλΆμ Young μμλ³΄λ€ ν¬κ² ν λΉνλ©°, Young μμ 보λ€λ GC κ° μ κ² λ°μνλ€.
- μ΄ μμμμ κ°μ²΄κ° μ¬λΌμ§λ
Major GC
(νΉμ Full GC) κ° λ°μνλ€.
Permanent Generation Area
- κ°μ²΄λ μ΅λ₯λ λ¬Έμμ΄ μ 보λ₯Ό μ μ₯νλ κ³³
- μ΄ μμμμ κ°μ²΄κ° μ¬λΌμ§λ
Major GC
κ° λ°μνλ€.
Old μμμμ Young μμ μ°Έμ‘°κ° μΌμ΄λ λλ
Card Table
μ΄λΌλ μμμ μ¬μ©νλ€.
Young μμ ꡬμ±
Young μμμ λ€μ 3κ°μ μμμΌλ‘ ꡬμ±λλ€.
- Eden Area (1κ°)
- Survivor Area (2κ°)
- μλ‘ μμ±ν λλΆλΆμ κ°μ²΄λ
Eden
μμμ μμΉνλ€. Eden
μμμμ GC κ° νλ² λ°μν ν μ΄μλ¨μ κ°μ²΄λSurvivor
μμ μ€ νλλ‘ μ΄λλλ€.- νλμ
Survivor
μμμ΄ κ°λ μ°¨κ²λλ©΄ κ·Έμ€ μ΄μλ¨μ κ°μ²΄λ₯Ό λ€λ₯ΈSurvivor
μμμΌλ‘ μ΄λνκ³ κ°λμ°¬Survivor
μμμ μ무λ°μ΄ν°λ μλ μνκ° λλ€. - μ΄ κ³Όμ μ λ°λ³΅νλ©° μ΄μλ¨μ κ°μ²΄λ Old μμμΌλ‘ μ΄λνκ² λλ€.
Survivor
μμ μ€ νλλ λ°λμ λΉμ΄μλ μνλ‘ λ¨μ μμ΄μΌ νλ€. λ§μ½ λSurvivor
μμμ΄ λͺ¨λ λ°μ΄ν°κ° μ‘΄μ¬νκ±°λ, λκ°μSurvivor
μμμ μ¬μ©λμ΄ 0 μ΄λΌλ©΄ μμ€ν μ μ μμ μΈ μν©μ΄ μλλ€.
HotSpot VM μ λ©λͺ¨λ¦¬ ν λΉ κΈ°μ
Young μμμλ κ°μ²΄μ μ΄λμ΄ λΉλ²νκΈ° λλ¬Έμ κ°μ λ λ©λͺ¨λ¦¬ ν λΉ κΈ°μ μ΄ νμνλ€.
λ€μμ HotSpot VM μμ μ¬μ©μ€μΈ 2κ°μ§μ λ©λͺ¨λ¦¬ ν λΉ κΈ°μ μ΄λ€.
- bump-the-pointer
Eden
μμμ ν λΉλ λ§μ§λ§ κ°μ²΄λ₯Ό μΆμ νλ€.- λ§μ§λ§ κ°μ²΄λ TOP μ μμΉνκ³ μκΈ° λλ¬Έμ μ½μ
νλ €λ κ°μ²΄μ ν¬κΈ°κ°
Eden
μμμ λ£κΈ°μ μ λΉνμ§ νμΈνμ¬ μΆκ°νλ€. - μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν λ λ§μ§λ§μ μΆκ°λ κ°μ²΄λ§ μ κ²νλ©΄ λλ―λ‘ λ§€μ° λΉ λ₯΄κ² λ©λͺ¨λ¦¬ ν λΉμ΄ μ΄λ£¨μ΄μ§λ€.
- TLABs (Thread Local Allocation Buffers)
- Multi Thread νκ²½μμ Tread-Safe νκΈ° μν΄μ Eden μμμ Lock μ΄ λ°μ ν μ λ°μ μλλ° μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μ HotSpot VM μμ μ§μνλ
TLABs
κΈ°μ μ΄ μλ€.
- Multi Thread νκ²½μμ Tread-Safe νκΈ° μν΄μ Eden μμμ Lock μ΄ λ°μ ν μ λ°μ μλλ° μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μ HotSpot VM μμ μ§μνλ
Old μμμ GC
Old μμμ λ°μ΄ν°κ° κ°λμ°¨λ©΄ GC λ₯Ό μ€ννλ€.
λ€μ GCλ JDK 7 κΈ°μ€μ 5κ°μ§ λ°©λ²μ΄λ€.
- Serial GC
- CPU μ½μ΄ κ°μκ° μ μ λ μ ν©
- Parallel GC
- λ©λͺ¨λ¦¬μ CPU μ½μ΄ κ°μκ° λ§μ λ μ 리
- Parallel Old GC (Parallel Compacting GC)
- Concurrent Mark & Sweep GC (CMS)
- μ ν리μΌμ΄μ μλ΅μ΄ μ€μν κ²½μ° μ¬μ© (Low Latency GC)
- λ€λ₯Έ GC μ λΉν΄ λ©λͺ¨λ¦¬μ CPU λ₯Ό λ λ§μ΄ μ¬μ©
- λ€λ₯Έ GC μ λΉν΄ μ°μ¬λ λ©λͺ¨λ¦¬κ° λ§μμ μκΈ° λλ¬Έμ
stop-the-world
μκ°μ΄ λ κΈΈλ€.
- G1 (Garbage First) GC
- κ°μ₯ μ΅μ μ κ°μ₯ μ±λ₯μ΄ μ’μ GC (JDK 7 μ΄μ)
β Thread Local Java Vertual Machine β