Garbage Collection - accidentlywoo/legacyVue GitHub Wiki

Garbage Collection

Minor GC

μƒˆλ‘œ μƒμ„±λœ λŒ€λΆ€λΆ„μ˜ 객체(Instance)λŠ” Eden μ˜μ—­μ— μœ„μΉ˜ν•œλ‹€. Edenμ˜μ—­μ—μ„œ GCκ°€ ν•œ 번 λ°œμƒν•œ ν›„ 살아남은 κ°μ²΄λŠ” Suvivor μ˜μ—­ 쀑 ν•˜λ‚˜λ‘œ μ΄λ™λœλ‹€. 이 과정을 λ°˜λ³΅ν•˜λ‹€κ°€ κ³„μ†ν•΄μ„œ 살아남아 μžˆλŠ” κ°μ²΄λŠ” μΌμ •μ‹œκ°„ 참쑰되고 μžˆλ‹€λŠ” λœ»μ΄λ―€λ‘œ Oldμ˜μ—­μœΌλ‘œ μ΄λ™μ‹œν‚¨λ‹€.

Major GC

Old μ˜μ—­μ— μžˆλŠ” λͺ¨λ“  객체듀을 κ²€μ‚¬ν•˜μ—¬ μ°Έμ‘°λ˜μ§€ μ•Šμ€ 객체듀을 ν•œκΊΌλ²ˆμ— μ‚­μ œν•œλ‹€. μ‹œκ°„μ΄ 였래 걸리고 μ‹€ν–‰ 쀑 ν”„λ‘œμ„ΈμŠ€κ°€ μ •μ§€λœλ‹€. 이것을 'stop-the-world'라고 ν•˜λŠ”λ° Major Gcκ°€ λ°œμƒν•˜λ©΄ GCλ₯Ό μ‹€ν–‰ν•˜λŠ” μŠ€λ ˆλ“œλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μŠ€λ ˆλ“œλŠ” λͺ¨λ‘ μž‘μ—…μ„ λ©ˆμΆ˜λ‹€. GCμž‘μ—…μ„ μ™„λ£Œν•œ 이후에야 μ€‘λ‹¨ν–ˆλ˜ μž‘μ—…μ„ λ‹€μ‹œ μ‹œμž‘ν•œλ‹€.

가비지 μ»¬λ ‰μ…˜μ€ μ–΄λ–€ μ›λ¦¬λ‘œ μ†Œλͺ…μ‹œν‚¬ λŒ€μƒμ„ μ„ μ •ν•˜λŠ”κ°€?

μ•Œκ³ λ¦¬μ¦˜μ— 따라 λ™μž‘ 방식이 맀우 λ‹€μ–‘ν•˜μ§€λ§Œ 곡톡적인 원리가 μžˆλ‹€. Garbage CollectorλŠ” νž™ λ‚΄μ˜ 객체 μ€‘μ—μ„œ 가비지(Garbage)λ₯Ό μ°Ύμ•„λ‚΄κ³  μ°Ύμ•„λ‚Έ 가비지λ₯Ό μ²˜λ¦¬ν•΄μ„œ νž™μ˜ λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•œλ‹€. μ°Έμ‘°λ˜κ³ μžˆμ§€ μ•Šμ€ 객체(Intance)λ₯Ό 가비지라고 ν•˜λ©° 객체가 가비지인지 μ•„λ‹Œμ§€ νŒλ‹¨ν•˜κΈ° μœ„ν•΄μ„œ reachabilityλΌλŠ” κ°œλ…μ„ μ‚¬μš©ν•œλ‹€. μ–΄λ–€ νž™ μ˜μ—­μ— ν• λ‹Ήλœ 객체가 μœ νš¨ν•œ μ°Έμ‘°κ°€ 있으면 reachability ,μ—†λ‹€λ©΄ unreachability 둜 νŒλ‹¨ν•œλ‹€. ν•˜λ‚˜μ˜ κ°μ²΄λŠ” λ‹€λ₯Έ 객체λ₯Ό μ°Έμ‘°ν•˜κ³ , λ‹€λ₯Έ κ°μ²΄λŠ” 또 λ‹€λ₯Έ 객체λ₯Ό μ°Έμ‘°ν•  수 있기 λ•Œλ¬Έμ— μ°Έμ‘° μ‚¬μŠ¬μ΄ ν˜•μ„±μ΄ λ˜λŠ”λ°, 이 μ°Έμ‘° μ‚¬μŠ¬ 쀑 μ΅œμ΄ˆμ— μ°Έμ‘°ν•œ 것을 Root Set이라고 μΉ­ν•œλ‹€. νž™ μ˜μ—­μ— μžˆλŠ” 객체듀은 총 4가지에 λŒ€ν•œ μ°Έμ‘°λ₯Ό ν•˜κ²Œ λœλ‹€.

    1. νž™ λ‚΄μ˜ λ‹€λ₯Έ 객체에 μ˜ν•œ μ°Έμ‘°
    1. JavaμŠ€νƒ, 즉 Javaλ©”μ„œλ“œ μ‹€ν–‰ μ‹œμ— μ‚¬μš©ν•˜λŠ” μ§€μ—­λ³€μˆ˜μ™€ νŒŒλΌλ―Έν„°λ“€μ— μ˜ν•œ μ°Έμ‘°
    1. λ„€μ΄ν‹°λΈŒ μŠ€νƒ(JNI,Java Native Interface)에 μ˜ν•΄ μƒμ„±λœ 객체에 λŒ€ν•œ μ°Έμ‘°
    1. λ©”μ„œλ“œ μ˜μ—­μ˜ 정적 λ³€μˆ˜μ— μ˜ν•œ μ°Έμ‘° 2,3,4λŠ” Root Set이닀. 즉 μ°Έμ‘° μ‚¬μŠ¬ 쀑 μ΅œμ΄ˆμ— μ°Έμ‘°ν•œ 것이닀.

μΈμŠ€ν„΄μŠ€κ°€ 가비지 μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ λ˜μ—ˆλ‹€κ³  ν•΄μ„œ λ°”λ‘œ μ†Œλ©Έμ΄ λ˜λŠ” 것은 μ•„λ‹ˆλ‹€. λΉˆλ²ˆν•œ 가비지 μ»¬λ ‰μ…˜μ˜ 싀행은 μ‹œμŠ€ν…œμ— 뢀담이 될 수 μžˆκΈ°μ— μ„±λŠ₯에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šλ„λ‘ 가비지 μ»¬λ ‰μ…˜ μ‹€ν–‰ 타이밍은 λ³„λ„μ˜ μ•Œκ³ λ¦¬μ¦˜μ„ 기반으둜 계산이 되며, 이 계산결과λ₯Ό 기반으둜 가비지 μ»¬λ ‰μ…˜μ΄ μˆ˜ν–‰λœλ‹€.

Serial GC

Old μ˜μ—­μ˜ GCλŠ” mark-sweep-compact λΌλŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œλ‹€. 이 μ•Œκ³ λ¦¬μ¦˜μ˜ 첫 λ‹¨κ³„λŠ” Old μ˜μ—­μ— μ‚΄μ•„μžˆλŠ” 객체λ₯Ό 식별(Mark)ν•˜λŠ” 것이닀. κ·Έ λ‹€μŒμ—λŠ” νž™(Heap)의 μ•ž λΆ€λΆ„λΆ€ν„° ν™•μΈν•˜μ—¬ μ‚΄μ•„μžˆλŠ” κ²ƒλ§Œ 남긴닀(Sweep). λ§ˆμ§€λ§‰ λ‹¨κ³„μ—μ„œλŠ” 각 객체듀이 μ—°μ†λ˜κ²Œ μŒ“μ΄λ„λ‘ νž™μ˜ κ°€μž₯ μ•ž λΆ€λΆ„λΆ€ν„° μ±„μ›Œμ„œ 객체가 μ‘΄μž¬ν•˜λŠ” λΆ€λΆ„κ³Ό 객체가 μ—†λŠ” λΆ€λΆ„μœΌλ‘œ λ‚˜λˆˆλ‹€. λ§ˆμ§€λ§‰μ„ Compaction이라 ν•œλ‹€.

Parallel GC

기본적인 GC μ•Œκ³ λ¦¬μ¦˜μ€ Serial GC와 λ™μΌν•˜μ§€λ§Œ Parallel GCλŠ” GCλ₯Ό μ²˜λ¦¬ν•˜λŠ” μŠ€λ ˆλ“œκ°€ μ—¬λŸ¬ κ°œλΌμ„œ 보닀 λΉ λ₯Έ GCλ₯Ό μˆ˜ν–‰ν•  수 μžˆλ‹€. λ©”λͺ¨λ¦¬κ°€ μΆ©λΆ„ν•˜κ³  μ½”μ–΄μ˜ κ°œμˆ˜κ°€ λ§Žμ„ λ•Œ μœ λ¦¬ν•˜λ‹€.

Parallel Old GC(Parallel Compacting GC)

JDK 5 update 6λΆ€ν„° μ œκ³΅ν•œ GC방식이닀. λ³„λ„λ‘œ μ‚΄μ•„μžˆλŠ” 객체λ₯Ό μ‹λ³„ν•œλ‹€λŠ” λΆ€λΆ„μ—μ„œ 보닀 λ³΅μž‘ν•œ λ‹¨κ³„λ‘œ μˆ˜ν–‰λœλ‹€.

  • Concurrent Mark & Sweep GC(μ΄ν•˜ CMS)
  • G1(Garbage First) GC