JDK 5.0μ΄μμμ μ§μνλ GC λ°©μμλ λ€κ°μ§κ° μλ€. WASλ μλ° μ ν리μΌμ΄μ μνμ μ΅μ μ μ§μ νμ¬ μ νν μ μλ€.
4κ°μ§ GC(κ°λΉμ§ μ½λ ν°) λ°©μ
- Serial GC (μλ¦¬μΌ μ½λ ν°)
- Parallel GC (λ³λ ¬ μ½λ ν°)
- Parallel Compacting GC (Parallel Old GC, λ³λ ¬ μ»΄ν©ν μ½λ ν°)
- Concurrent Mark-Sweep GC (CMS μ½λ ν°)
- Garbage First GC (G1 GC)
JVM GC λμ μμ
μμ½νλ©΄ GC λμμ μλ 3 STEPμΌλ‘ λλ μ§λ€.
- Heap μμμ μ‘΄μ¬νλ κ°μ²΄λ€μ λν΄ μ κ·Ό κ°λ₯νμ§ νμΈνλ€.
- GC Rootμμ λΆν° μμνμ¬ μ°Έμ‘°κ°μ λ°λΌκ°λ©° μ κ·Ό κ°λ₯ν κ°μ²΄λ€μ Markνλ κ³Όμ μ μ§ννλ€.
- Mark λμ§ μμ κ°μ²΄ μ¦, μ κ·Όν μ μλ κ°μ²΄λ μ κ±°(Sweep) λμμ΄ λκ³ , ν΄λΉ κ°μ²΄λ€μ μ κ±°νλ€.
μ κ·Ό κ°λ₯ν κ°μ²΄ νλ¨ κ³Όμ
GC Rootμμ μμν΄μ μ°Έμ‘°νλ κ°μ²΄λ₯Ό μ°Ύκ³ , λ κ·Έ κ°μ²΄κ° μ°Έμ‘°νλ κ°μ²΄λ₯Ό μ°Ύμκ°λ©° Mark νλ€.
Mark λμ§ μμ κ°μ²΄λ μ κ·Όν μ μλ κ°μ²΄ (Unreachable Object)λ‘ νλ¨νκ³ λ©λͺ¨λ¦¬λ₯Ό λλ©° μ κ±°(Sweep)νλ€.
GC Rootκ° λ μ μλ λμ
- JVM λ©λͺ¨λ¦¬μ Stack μμμ μ‘΄μ¬νλ μ°Έμ‘° λ³μ
- Method Areaμ static λ°μ΄ν°
- JNIμ μν΄ μμ±λ κ°μ²΄λ€
1. Serial GC
Young μμκ³Ό Old μμμ΄ μ리μΌνκ²(μ°μμ μΌλ‘) μ²λ¦¬λλ©° νλμ CPUλ₯Ό μ¬μ©νλ€.
μ΄ μ²λ¦¬λ₯Ό μνν λλ₯Ό Stop-the-worldλΌκ³ νννλ€. λ€μ λ§νλ©΄, μ½λ μ μ΄ μνλ λ μ ν리μΌμ΄μ μνμ΄ μ μ§λλ€.
- κ°μ₯ λ¨μν λ°©μμ GCλ‘ μ±κΈ μ€λ λ(μ€λ λ 1κ°)λ‘ λμνλ€.
- μ±κΈ μ€λ λλ‘ λμνμ¬ λλ¦¬κ³ , κ·Έλ§νΌ Stop The World μκ°μ΄ λ€λ₯Έ GCμ λΉν΄ κΈΈλ€.
- Mark & Sweep & Compact μκ³ λ¦¬μ¦μ μ¬μ©
- λ³΄ν΅ μ€λ¬΄μμ μ¬μ©νλ κ²½μ°λ μμ (λλ°μ΄μ€ μ±λ₯μ΄ μμ’μμ CPU μ½μ΄κ° 1κ°μΈ κ²½μ°μλ§ μ¬μ©)
- μΌλ¨ μ΄μμλ κ°μ²΄λ€μ Eden μμμ μλ€.
- Eden μμμ΄ κ½μ°¨κ² λλ©΄ To Survivor μμ(λΉμ΄μλ μμ)μΌλ‘ μ΄μ μλ κ°μ²΄κ° μ΄λνλ€. μ΄λ Survivor μμμ λ€μ΄κ°κΈ°μ λ무 ν° κ°μ²΄λ λ°λ‘ Old μμμΌλ‘ μ΄λνλ€. κ·Έλ¦¬κ³ From Survivor μμμ μλ μ΄μ μλ κ°μ²΄λ To Survivor μμμΌλ‘ μ΄λνλ€.
- To Survivor μμμ΄ κ½ μ°Όμ κ²½μ°, Eden μμμ΄λ From Survivor μμμ λ¨μ μλ κ°μ²΄λ€μ Old μμμΌλ‘ μ΄λν©λλ€.
μ΄ μ΄νμ Old μμμ΄λ Perm μμμ μλ κ°μ²΄λ€μ Mark-sweep-compact μ½λ μ μκ³ λ¦¬μ¦μ λ°λ₯Έλ€. μ΄ μκ³ λ¦¬μ¦μ λν΄μ κ°λ¨νκ² λ§νλ©΄, μ μ°λ κ±° νμν΄μ μμ νκ³ ν κ³³μΌλ‘ λͺ¨μΌλ μκ³ λ¦¬μ¦μ΄λ€.
Mark-sweep-compact μκ³ λ¦¬μ¦
1) Old μμμΌλ‘ μ΄λλ κ°μ²΄λ€ μ€ μ΄μ μλ κ°μ²΄λ₯Ό μλ³νλ€. (Mark)
2) Old μμμ κ°μ²΄λ€μ νλ μμ μ μννμ¬ μ°λ κΈ° κ°μ²΄λ₯Ό μλ³νλ€. (Sweep)
3) νμ μλ κ°μ²΄λ€μ μ§μ°κ³ μ΄μ μλ κ°μ²΄λ€μ ν κ³³μΌλ‘ λͺ¨μλ€. (Compact)
μ΄λ κ² μλνλ μλ¦¬μΌ μ½λ ν°λ μΌλ°μ μΌλ‘ ν΄λΌμ΄μΈνΈ μ’ λ₯μ μ₯λΉμμ λ§μ΄ μ¬μ©λλ€. λ€μ λ§νλ©΄, λκΈ° μκ°μ΄ λ§μλ ν¬κ² λ¬Έμ λμ§ μλ μμ€ν μμ μ¬μ©λλ€.
λͺ μμ μ§μ λ°©λ²
-XX:+UseSerialGC
2. Parallel GC
μ΄ λ°©μμ throughput collectorλ‘λ μλ €μ§ λ°©μμ΄λ€. μ΄ λ°©μμ λͺ©νλ λ€λ₯Έ CPUκ° λκΈ° μνλ‘ λ¨μ μλ κ²μ μ΅μννλ κ²μ΄λ€.
μλ¦¬μΌ μ½λ ν°μ λ¬λ¦¬ Young μμμμμ μ½λ μ μ λ³λ ¬(Parallel)λ‘ μ²λ¦¬νλ€. λ§μ CPU λ₯Ό μ¬μ©νκΈ° λλ¬Έμ GCμ λΆνλ₯Ό μ€μ΄κ³ μ ν리μΌμ΄μ μ μ²λ¦¬λμ μ¦κ°μν¬ μ μλ€.
- Java 8μ default GC
- Young μμμ GCλ₯Ό λ©ν° μ€λ λ λ°©μμ μ¬μ©νκΈ° λλ¬Έμ, Serial GCμ λΉν΄ μλμ μΌλ‘ Stop The World κ° μ§§λ€
- Old μμμ μλ
- Old μμμ GCλ μλ¦¬μΌ μ½λ ν°μ λ§μ°¬κ°μ§λ‘ Mark-Sweep-Compact μ½λ μ μκ³ λ¦¬μ¦μ μ¬μ©νλ€.
λͺ μμ μ§μ λ°©λ²
-XX:+UseParallelGC
3. Parallel Compacting GC
λ³λ ¬ μ½λ ν°μ λ€λ₯Έ μ μ Old μμ GCμμ μλ‘μ΄ μκ³ λ¦¬μ¦μ μ¬μ©νλ€.
- Parallel GCλ Young μμμ λν΄μλ§ λ©ν° μ€λ λ λ°©μμ μ¬μ©νλ€λ©΄, Parallel Old GCλ OldμμκΉμ§ λ©ν°μ€λ λ λ°©μμ μ¬μ©
κ·Έλ¬λ―λ‘ Young μμμ λν GCλ λ³λ ¬ μ½λ ν°μ λμΌνμ§λ§, Old μμμ GCλ λ€μμ 3λ¨κ³λ₯Ό κ±°μΉκ² λλ€.
- Mark λ¨κ³ : μ΄μ μλ κ°μ²΄λ₯Ό μλ³νμ¬ νμν΄ λλ λ¨κ³
- Sweep λ¨κ³ : μ΄μ μ GCλ₯Ό μννμ¬ μ»΄ν©μ λ μμμ μ΄μ μλ κ°μ²΄μ μμΉλ₯Ό μ‘°μ¬νλ λ¨κ³
- Compact λ¨κ³ : μ»΄ν©μ μ μννλ λ¨κ³. μν μ΄νμλ μ»΄ν©μ λ μμκ³Ό λΉμ΄ μλ μμμΌλ‘ λλ©λλ€.
λ³λ ¬ μ½λ ν°μ λμΌνκ² μ΄ λ°©μλ μ¬λ¬ CPUλ₯Ό μ¬μ©νλ μλ²μ μ ν©νλ€. GCλ₯Ό μ¬μ©νλ μ€λ λ κ°μλ -XX:+ParallelGCThreads=n μ΅μ μΌλ‘ μ§μ ν μ μλ€.
λͺ μμ μ§μ λ°©λ²
-XX:+UseParallelOldGC
-XX:+ParallelGCThreads=n
4. Concurrent Mark-Sweep GC
Stop The Worldλ‘ Java Applicationμ΄ λ©μΆλ νμμ μ€μ΄κ³ μ λ§λ GC
Reacable ν κ°μ²΄λ₯Ό νλ²μ μ°Ύμ§ μκ³ λλ μ μ°Ύλ λ°©μμ μ¬μ© (4 STEP)
μ΄ λ°©μμ low-latency collectorλ‘λ μλ €μ Έ μμΌλ©°, ν λ©λͺ¨λ¦¬ μμμ ν¬κΈ°κ° ν΄ λ μ ν©νλ€. Young μμμ λν GCλ λ³λ ¬ μ½λ ν°μ λμΌν©λλ€. Old μμμ GCλ λ€μ 4λ¨κ³λ₯Ό κ±°μΉλ€.
- Initial Mark : GC Rootκ° μ°Έμ‘°νλ κ°μ²΄λ§ λ§νΉ (stop-the-world λ°μ)
- μ΄μ μλ κ°μ²΄λ₯Ό μ°Ύλ λ¨κ³
- Concurrent Mark : μ°Έμ‘°νλ κ°μ²΄λ₯Ό λ°λΌκ°λ©°, μ§μμ μΌλ‘ λ§νΉ. (stop-the-world μμ΄ μ΄λ£¨μ΄μ§)
- μλ² μνκ³Ό λμμ μ΄μ μλ κ°μ²΄μ νμλ₯Ό ν΄λλ λ¨κ³
- Remark : concurrent mark κ³Όμ μμ λ³κ²½λ μ¬νμ΄ μλμ§ λ€μ νλ² λ§νΉνλ©° νμ νλ κ³Όμ . (stop-the-world λ°μ)
- Concurrent Sweep : μ κ·Όν μ μλ κ°μ²΄λ₯Ό μ κ±°νλ κ³Όμ (stop-the-world μμ΄ μ΄λ£¨μ΄μ§)
μμ κ°μ΄ stop-the-worldκ° μ΅λν λ λ°μνλλ‘ νμ¬, Java Applicationμ΄ λ©μΆλ νμμ μ€μΈλ€.
CMSλ μ»΄ν©μ λ¨κ³λ₯Ό κ±°μΉμ§ μκΈ° λλ¬Έμ μΌμͺ½μΌλ‘ λ©λͺ¨λ¦¬λ₯Ό λͺ°μ λλ μμ μ μννμ§ μλλ€. κ·Έλμ GC μ΄νμ κ·Έλ¦Όκ³Ό κ°μ΄ λΉ κ³΅κ°μ΄ λ°μνλ―λ‘, -XX:+CMSInitiatingOccupancyFraction=n μ΅μ μ μ¬μ©νμ¬ Old μμμ %λ₯Ό n κ°μ μ§μ ν©λλ€. (κΈ°λ³Έκ° : 68)
CMS μ½λ ν°λ μΆκ°μ μΈ μ΅μ
μΌλ‘ μ μ§μ λ°©μμ μ§μνλ€. μ΄ λ°©μμ Young μμμ GCλ₯Ό λ μκ² μͺΌκ°μ΄ μλ²μ λκΈ° μκ°μ μ€μΌ μ μλ€. CPUκ° λ§μ§ μκ³ μμ€ν
μ λκΈ° μκ°μ΄ 짧μμΌ ν λ μ¬μ©νλ©΄ μ’λ€.
μ μ§μ μ GCλ₯Ό μννλ €λ©΄ -XX:+CMSIncrementalMode μ΅μ
μ μ§μ νλ©΄ λλ€. JVMμ λ°λΌμλ -XingcλΌλ μ΅μ
μ μ§μ ν΄λ κ°μ μλ―Έκ° λλ€. νμ§λ§ μ΄ μ΅μ
μ μ§μ ν κ²½μ° μκΈ°μΉ λͺ»ν μ±λ₯ μ νκ° λ°μν μ μμΌλ―λ‘, μΆ©λΆν ν
μ€νΈλ₯Ό ν νμ μ΄μ μλ²μ μ μ©ν΄μΌ νλ€.
CMS GCλ 2κ° μ΄μμ νλ‘μΈμλ₯Ό μ¬μ©νλ μλ²μ μ λΉνλ€. κ°μ₯ μ λΉν λμμΌλ‘λ μΉ μλ²κ° μλ€.
λͺ μμ μ§μ λ°©λ²
-XX:+UseConcMarkSweepGC
-XX:+CMSInitiatingOccupancyFraction=n
-XX:+CMSIncrementalMode
CMS GCλ Java9 λ²μ ΌλΆν° deprecated λμκ³ κ²°κ΅ Java14μμλ μ¬μ©μ΄ μ€μ§λμλ€.
5. G1 GC
- Java 9 λΆν° default GC
- νμ¬ GC μ€ stop-the-worldμ μκ°μ΄ μ μΌ μ§§μ
- μ΄λ ν GC λ°©μλ³΄λ€ μ²λ¦¬ μλκ° λΉ λ₯΄λ©° ν° λ©λͺ¨λ¦¬ 곡κ°μμ λ©ν° νλ‘λ μ€ κΈ°λ°μΌλ‘ μ΄μλλ μ ν리μΌμ΄μ μ μν΄ κ³ μλμλ€. λν G1 GCλ λ€λ₯Έ GC λ°©μμ μ²λ¦¬μλλ₯Ό λ₯κ°νλ€.
- CMS GC λ₯Ό κ°μ νμ¬ λ§λ GCλ‘ μμμ μ΄ν΄λ³Έ GCμλ λ€λ₯Έ ꡬ쑰λ₯Ό κ°μ§λ€.
- Heapμ Regionμ΄λΌλ μΌμ ν λΆλΆμΌλ‘ λλ μ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬νλ€.
- κΈ°μ‘΄ GCμ²λΌ 물리μ μΈ μμμΌλ‘ λλμ§ μκ³ , Region(μ§μ)μ΄λΌλ κ°λ μ μλ‘ λμ νμ¬ Heapμ κ· λ±νκ² μ¬λ¬ κ°μ μ§μμΌλ‘ λλκ³ , κ° μ§μμ μν κ³Ό ν¨κ» λ Όλ¦¬μ μΌλ‘ ꡬλΆνμ¬(Eden μ§μμΈμ§, Survivor μ§μμΈμ§, Old μ§μμΈμ§) κ°μ²΄λ₯Ό ν λΉνλ€.
- G1 GCμμλ Eden, Survivor, Old μν μ λν΄ Humongousμ Availalbe/UnusedλΌλ 2κ°μ§ μν μ μΆκ°νμλ€. Humongousλ Region ν¬κΈ°μ 50%λ₯Ό μ΄κ³Όνλ κ°μ²΄λ₯Ό μ μ₯νλ Regionμ μλ―Ένλ©°, Availabe/Unusedλ μ¬μ©λμ§ μμ Regionμ μλ―Ένλ€.
- G1 GCμ ν΅μ¬μ μ 체 Heapμ λν΄μ νμνμ§ μκ³ λΆλΆμ μΌλ‘ Region λ¨μλ‘ νμνμ¬, κ°λΉμ§κ° λ§μ Regionμλ§ μ°μ μ μΌλ‘ GCλ₯Ό μννλ κ²μ΄λ€.
- G1 GCλ λ€λ₯Έ κ°λΉμ§ 컬λ μ κ³Ό λ§μ°¬κ°μ§λ‘ 2κ°μ§ GC(Minor GC, Major GC)λ‘ λλμ΄ μνλλ€.
1. Minor GC
ν μ§μμ κ°μ²΄λ₯Ό ν λΉνλ€κ° ν΄λΉ μ§μμ΄ κ½ μ°¨λ©΄ λ€λ₯Έ μ§μμ κ°μ²΄λ₯Ό ν λΉνκ³ , Minor GCκ° μ€νλλ€. G1 GCλ κ° μ§μμ μΆμ νκ³ μκΈ° λλ¬Έμ, κ°λΉμ§κ° κ°μ₯ λ§μ(Garbage First) μ§μμ μ°Ύμμ Mark and Sweepλ₯Ό μννλ€.
Eden μ§μμμ GCκ° μνλλ©΄ μ΄μλ¨μ κ°μ²΄λ₯Ό μλ³(Mark)νκ³ , λ©λͺ¨λ¦¬λ₯Ό νμ(Sweep)νλ€. κ·Έλ¦¬κ³ μ΄μλ¨μ κ°μ²΄λ₯Ό λ€λ₯Έ μ§μμΌλ‘ μ΄λμν€κ² λλ€. 볡μ λλ μ§μμ΄ Available/Unused μ§μμ΄λ©΄ ν΄λΉ μ§μμ μ΄μ Survivor μμμ΄ λκ³ , Eden μμμ Available/Unused μ§μμ΄ λλ€.
2. Major GC(Full GC)
μμ€ν μ΄ κ³μ μ΄μλλ€κ° κ°μ²΄κ° λ무 λ§μ λΉ λ₯΄κ² λ©λͺ¨λ¦¬λ₯Ό νμ ν μ μμ λ Major GC(Full GC)κ° μ€νλλ€. κ·Έλ¦¬κ³ μ¬κΈ°μ G1 GCμ λ€λ₯Έ GCμ μ°¨μ΄μ μ΄ λκ°μ 보μΈλ€.
κΈ°μ‘΄μ λ€λ₯Έ GC μκ³ λ¦¬μ¦μ λͺ¨λ Heapμ μμμμ GCκ° μνλμμΌλ©°, κ·Έμ λ°λΌ μ²λ¦¬ μκ°μ΄ μλΉν μ€λ κ±Έλ Έλ€. νμ§λ§ G1 GCλ μ΄λ μμμ κ°λΉμ§κ° λ§μμ§λ₯Ό μκ³ μκΈ° λλ¬Έμ GCλ₯Ό μνν μ§μμ μ‘°ν©νμ¬ ν΄λΉ μ§μμ λν΄μλ§ GCλ₯Ό μννλ€. κ·Έλ¦¬κ³ μ΄λ¬ν μμ μ Concurrentνκ² μνλκΈ° λλ¬Έμ μ ν리μΌμ΄μ μ μ§μ°λ μ΅μνν μ μλ κ²μ΄λ€.
λ¬Όλ‘ G1 GCλ λ€λ₯Έ GC λ°©μμ λΉν΄ μ¦κ² νΈμΆλ κ²μ΄λ€. νμ§λ§ μμ κ·λͺ¨μ λ©λͺ¨λ¦¬ μ 리 μμ
μ΄κ³ Concurrentνκ² μνλκΈ° λλ¬Έμ΄ μ§μ°μ΄ ν¬μ§ μμΌλ©°, κ°λΉμ§κ° λ§μ μ§μμ λν΄ μ 리λ₯Ό νλ―λ‘ ν¨μ¬ ν¨μ¨μ μ΄λ€.
λͺ μμ μ§μ λ°©λ²
-XX:+UseG1GC
GC λ°©μ λΉκ΅
λ€ μ’ λ₯ GC λ°©μμ λν μ±λ₯ λ° κΈ°λ₯ λΉκ΅ ν
μμ λ΄μ©μ μ’ ν©νλ©΄, GC μν μμ μ λ€μκ³Ό κ°λ€.
- κ° μμμ ν λΉλ ν¬κΈ°μ λ©λͺ¨λ¦¬κ° νμ©μΉλ₯Ό λμ λ
- κ°λ°μκ° μ»¨νΈλ‘€ν μμμ μλ
κ°λ°μλΌλ©΄, μλ°μ GC λ°©μμ μΈμ°λ©΄μ κ°λ°νκ±°λ μλ²λ₯Ό μΈν ν νμλ μλ€. μ΄ν΄λ§ νκ³ μμΌλ©΄ λλ€. λ¨, νμν λ(μμ€ν μ€ν μ μ±λ₯ ν μ€νΈ / μλ² μΈν μ), μλ§μ GC λ°©μμ κ°λ°ν μμ€ν μ μ μ©νλ©΄ λλ€κ³ νλ€.
μ°Έκ³
'π > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] μΆμ ν΄λμ€ vs μΈν°νμ΄μ€ (0) | 2021.08.18 |
---|---|
[Java] Java SE, Java EE, Java ME (0) | 2021.08.18 |
[Java] λ³μμ scopeμ static (0) | 2021.08.11 |
[Java] κ°λΉμ§ 컬λ μ (Garbage Collection) (0) | 2021.08.11 |
[Java] λλ€μ (0) | 2021.08.10 |
λκΈ