κ°λΉμ§ 컬λ μ (Garbage Collection, GC)
κ°λΉμ§ 컬λ μ μ΄λ?
νλ‘κ·Έλλ° μΈμ΄μμ μ¬μ©λμ§ μλ λ©λͺ¨λ¦¬λ₯Ό μλμΌλ‘ κ²μΆνκ³ νμνλ νλ‘μΈμ€μ λλ€.
μ£Όλ‘ λ©λͺ¨λ¦¬ κ΄λ¦¬κ° νμν μΈμ΄μμ μ¬μ©λλ©°, κ°λ°μκ° μλμΌλ‘ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬νλ λΆλ΄μ μ€μ¬μ€λλ€.
κ°λΉμ§ 컬λ μ μ μ¬μ©νλ μ£Όμ μΈμ΄
- Java λ κ°μ₯ λνμ μΈ κ°λΉμ§ 컬λ μ μ μ¬μ©νλ μΈμ΄μ λλ€. Javaμ GCλ λ°νμμ μ€νλλ©°, μ°Έμ‘°λμ§ μλ κ°μ²΄λ€μ μλμΌλ‘ μ°Ύμ λ©λͺ¨λ¦¬λ₯Ό ν΄μ ν©λλ€. GCμ μ€ν μμ μ μμΈ‘ν μ μμΌλ©°, λλ‘λ μ±λ₯μ μν₯μ μ€ μ μμ΅λλ€.
- C# λν .NET νλ μμν¬μ μΌλΆλ‘ κ°λΉμ§ 컬λ μ μ μ 곡ν©λλ€. Javaμ μ μ¬νκ², μ¬μ©λμ§ μλ κ°μ²΄λ€μ μλμΌλ‘ μ°Ύμ λ©λͺ¨λ¦¬λ₯Ό ν΄μ ν©λλ€. C#μ GCλ μΈλλ³ κ°λΉμ§ 컬λ μ μ μ¬μ©νμ¬ λ©λͺ¨λ¦¬ κ΄λ¦¬μ ν¨μ¨μ±μ λμ λλ€.
- Pythonλ κ°λΉμ§ 컬λ μ μ μ¬μ©ν©λλ€. Pythonμ κ²½μ°, μ°Έμ‘° μΉ΄μ΄ν κ³Ό ν¨κ» μν μ°Έμ‘°λ₯Ό νμ§νκΈ° μν GCκ° κ²°ν©λμ΄ μμ΅λλ€.
κ° μΈμ΄μμμ μ°¨μ΄μ
Javaμ κ°λΉμ§ 컬λ μ
- μλ μ리: Javaμμ GCλ λ°νμμ μ€νλλ©°, κ°μ²΄μ λν μ°Έμ‘°κ° λ μ΄μ μ‘΄μ¬νμ§ μμ λ ν΄λΉ κ°μ²΄λ₯Ό κ°λΉμ§λ‘ κ°μ£Όν©λλ€.
- μΈλλ³ GC: Javaλ μ μλ(Young Generation), ν
λ΄μ΄λ μΈλ(Old Generation), λ©νμ€νμ΄μ€(Metaspace)μ κ°μ΄ λ©λͺ¨λ¦¬λ₯Ό μΈλλ³λ‘ κ΄λ¦¬νμ¬ ν¨μ¨μ λμ
λλ€.
C#μ κ°λΉμ§ 컬λ μ
- .NET νκ²½: C#μμ GCλ .NET νλ μμν¬μ μΌλΆλ‘, μλ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μ 곡ν©λλ€.
- μΈλλ³ GC: C# μμ Javaμ μ μ¬νκ² μΈλλ³ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μ¬μ©ν©λλ€.
- μ΅μ νλ μ±λ₯: C#μ GCλ λ©λͺ¨λ¦¬ κ΄λ¦¬μ μ΅μ νλμ΄ μμΌλ©°, λλΆλΆμ κ²½μ°μ λν λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μλμΌλ‘ μνν©λλ€.
Pythonμ κ°λΉμ§ 컬λ μ
- μ°Έμ‘° μΉ΄μ΄ν
: Pythonμ μ£Όμ λ©λͺ¨λ¦¬ κ΄λ¦¬ κΈ°λ²μ μ°Έμ‘° μΉ΄μ΄ν
μ΄λ©°, κ°μ²΄μ λν μ°Έμ‘° μκ° 0μ΄ λλ©΄ λ©λͺ¨λ¦¬λ₯Ό μλμΌλ‘ ν΄μ ν©λλ€.
- μν μ°Έμ‘°: Pythonμ GCλ μν μ°Έμ‘°(μλ‘ μ°Έμ‘°νλ κ°μ²΄λ€)λ₯Ό κ°μ§νκ³ ν΄μ νλ κΈ°λ₯μ ν¬ν¨ν©λλ€.
- λμ μΈμ΄: Pythonμ λμ νμ΄ν μΈμ΄λ‘, λ©λͺ¨λ¦¬ κ΄λ¦¬κ° λ°νμμ μ΄λ£¨μ΄μ§λλ€.
κ°λΉμ§ 컬λ μ μ 곡ν΅μ κ³Ό μ°¨μ΄μ
- 곡ν΅μ : λͺ¨λ μΈμ΄μμ GCλ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μλννμ¬ κ°λ°μμ λΆλ΄μ μ€μ΄κ³ , λ©λͺ¨λ¦¬ λμμ μνμ κ°μμν΅λλ€.
- μ°¨μ΄μ : κ°λΉμ§ 컬λ μ
μ ꡬνκ³Ό μκ³ λ¦¬μ¦μ μΈμ΄λ³λ‘ λ€λ¦
λλ€. Javaμ C#μ μΈλλ³ GCλ₯Ό μ¬μ©νμ¬ ν¨μ¨μ±μ λμ΄λ λ°λ©΄, Pythonμ μ£Όλ‘ μ°Έμ‘° μΉ΄μ΄ν
μ μμ‘΄νκ³ μν μ°Έμ‘° λ¬Έμ μ λμνκΈ° μν΄ μΆκ°μ μΈ GC λ©μ»€λμ¦μ κ°μ§λλ€. μ΄λ¬ν μ°¨μ΄λ κ° μΈμ΄μ λ°νμ νκ²½κ³Ό λ©λͺ¨λ¦¬ κ΄λ¦¬ μ λ΅μ κΈ°μΈν©λλ€.
κ·Έλ λ€λ©΄ C++μ κ°λΉμ§ 컬λ μ μ΄ μλλ°, μ΄λ»κ² νλμ§?
κ°λ°μλ `new` μ°μ°μλ₯Ό μ¬μ©νμ¬ νμ λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ , `delete` μ°μ°μλ₯Ό μ¬μ©νμ¬ ν λΉλ λ©λͺ¨λ¦¬λ₯Ό ν΄μ ν©λλ€. μ΄ λ°©λ²μ μ ννκ² λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬ν μ μμ§λ§, λ©λͺ¨λ¦¬ λμλ μ΄μ€ ν΄μ μ κ°μ μ€λ₯κ° λ°μν μνμ΄ μμ΅λλ€.
λ°λΌμ C++11λΆν°λ μ€λ§νΈ ν¬μΈν°(`std::unique_ptr`, `std::shared_ptr`, `std::weak_ptr`)λ₯Ό μ¬μ©νμ¬ μλ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μνν μ μμ΅λλ€. μ€λ§νΈ ν¬μΈν°λ κ°μ²΄μ μλͺ μ΄ λλλ©΄ μλμΌλ‘ λ©λͺ¨λ¦¬λ₯Ό ν΄μ ν©λλ€. RAII(Resource Acquisition Is Initialization) ν¨ν΄μ κ°μ²΄μ μλͺ κ³Ό μμ(λ©λͺ¨λ¦¬, νμΌ νΈλ€, λ€νΈμν¬ μ°κ²° λ±)μ κ΄λ¦¬λ₯Ό μ°κ²°ν©λλ€. κ°μ²΄κ° μλ©Έλ λ μλμΌλ‘ μμμ΄ ν΄μ λλλ‘ νμ¬, λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό λ³΄λ€ μμ νκ² ν©λλ€.
λν C++ νμ€ λΌμ΄λΈλ¬λ¦¬μ 컨ν μ΄λλ€(μ: `std::vector`, `std::map` λ±)μ μ체μ μΌλ‘ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μνν©λλ€. μ΄λ¬ν 컨ν μ΄λλ₯Ό μ¬μ©νλ©΄ κ°λ°μκ° μ§μ λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ ν΄μ ν νμκ° μμ΅λλ€.
μλ°μ κ°λΉμ§ 컬λ μ μ λν μ€λͺ
μλ°μμμ κ°λΉμ§ 컬λ μ
μ μ¬μ€ λ©λͺ¨λ¦¬ μ²μλΆ κ°μ μν μ ν©λλ€. μλ° κ°λΉμ§ 컬λ μ
μ μ£Ό λͺ©μ μ νλ‘κ·Έλ¨μ μν΄ ν λΉλμμ§λ§ λ μ΄μ μ°Έμ‘°λμ§ μλ κ°μ²΄λ€μ λ©λͺ¨λ¦¬μμ μ κ±°νλ κ²μ
λλ€. μ΄λ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νκ³ , νλ‘κ·Έλ¨μ μμ μ±κ³Ό μ±λ₯μ ν₯μμν΅λλ€.μ΄ λλΆμ κ°λ°μλ€μ λ©λͺ¨λ¦¬ κ΄λ¦¬μ μ κ²½ μ°μ§ μκ³ νλ‘κ·Έλλ°μ μ§μ€ν μ μμ΅λλ€. κ°λΉμ§ 컬λ ν°λ κ°μ²΄κ° λ μ΄μ μ¬μ©λμ§ μμΌλ©΄, μ¦ λ μ΄μ μ°Έμ‘°λμ§ μμΌλ©΄ λ©λͺ¨λ¦¬μμ κ·Έ κ°μ²΄λ₯Ό μ κ±°ν©λλ€.
μλ°μμλ κ°μ²΄λ€μ μΈλλ³λ‘ κ΄λ¦¬ν΄μ. μλ‘ μμ±λ κ°μ²΄λ 'μ μ μΈλ'μ λ€μ΄κ°κ³ , μκ°μ΄ μ§λ μ΄μλ¨μ κ°μ²΄λ€μ 'μ£Ό μΈλ'λ‘ μ΄λνμ£ . μ΄λ° λ°©μμΌλ‘ λ©λͺ¨λ¦¬λ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν©λλ€. λν, λ©λͺ¨λ¦¬μ λ¨νΈνλ₯Ό λ§κΈ° μν΄ κ°λ 'μ»΄ν©μ
' μμ
μ μ§ννκΈ°λ ν΄μ. κ°λΉμ§ 컬λ μ
μ μ ν리μΌμ΄μ
μ μ±λ₯μ ν° μν₯μ λ―ΈμΉκΈ° λλ¬Έμ, μ΄λ₯Ό μ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€.
- λλ¬ κ°λ₯μ± λΆμ(Reachability Analysis): GCλ 'κ°λΉμ§'λ₯Ό μλ³νκΈ° μν΄ 'λλ¬ κ°λ₯μ± λΆμ'μ΄λΌλ κ³Όμ μ μνν©λλ€. μ΄ κ³Όμ μμ GCλ 'λ£¨νΈ μ§ν©(root set)'μΌλ‘λΆν° μμνμ¬ μ°Έμ‘°λ₯Ό λ°λΌκ°λ©° λλ¬ κ°λ₯ν κ°μ²΄λ₯Ό μλ³ν©λλ€. λ£¨νΈ μ§ν©μλ νμ± μ€λ λ, μ μ νλ, JNI μ°Έμ‘° λ±μ΄ ν¬ν¨λ©λλ€.
- λ§νΉ(Marking): λλ¬ κ°λ₯ν κ°μ²΄λ€μ 'λ§νΉ' κ³Όμ μ ν΅ν΄ μλ³λ©λλ€. μ΄ λ¨κ³μμ GCλ λͺ¨λ λλ¬ κ°λ₯ν κ°μ²΄λ₯Ό νμνκ³ , μ΄λ€μ΄ μ°Έμ‘°νλ λ€λ₯Έ κ°μ²΄λ€μ μ¬κ·μ μΌλ‘ νμν©λλ€.
- μ€μν(Sweeping): λ§νΉ κ³Όμ μ΄ μλ£λ ν, GCλ λ§νΉλμ§ μμ κ°μ²΄λ€μ λ©λͺ¨λ¦¬μμ μ κ±°ν©λλ€. μ΄ λ¨κ³μμ μ€μ λ‘ λ©λͺ¨λ¦¬κ° ν΄μ λ©λλ€.
- μ»΄ν©μ (Compaction): κ°λΉμ§ 컬λ μ κ³Όμ μμλ λ©λͺ¨λ¦¬ λ¨νΈνκ° λ°μν μ μμ΅λλ€. μ»΄ν©μ λ¨κ³μμλ μμ‘΄νλ κ°μ²΄λ€μ λ©λͺ¨λ¦¬ μμ μ°μλ μμμΌλ‘ μ΄λμμΌ λ¨νΈνλ₯Ό μ€μ λλ€.
- μΈλλ³ κ°λΉμ§ 컬λ μ (Generational GC): μλ°μ GCλ κ°μ²΄μ μλͺ μ£ΌκΈ°λ₯Ό κΈ°λ°μΌλ‘ μ¬λ¬ 'μΈλ(generations)'λ‘ λ©λͺ¨λ¦¬λ₯Ό λλμ΄ κ΄λ¦¬ν©λλ€. μΌλ°μ μΌλ‘ 'μ μ μΈλ(Young Generation)', 'μ£Ό μΈλ(Old Generation)', 'μꡬ μΈλ(Permanent Generation λλ Metaspace)'λ‘ κ΅¬λΆλ©λλ€.
- μ μ μΈλ(Young Generation) GC: μ μ μΈλλ μλ‘ μμ±λ κ°μ²΄λ€μ΄ μμΉνλ μμμ λλ€. λλΆλΆμ κ°μ²΄λ μ¬κΈ°μ μμ±λκ³ λΉ λ₯΄κ² μλ©Έλ©λλ€. μ μ μΈλμμ GCκ° λ°μνλ κ²μ 'Minor GC'λΌκ³ λΆλ¦ λλ€.
- μ£Ό μΈλ(Old Generation) GC: μκ°μ΄ μ§λ μ μ μΈλμμ μ΄μλ¨μ κ°μ²΄λ€μ μ£Ό μΈλλ‘ μ΄λν©λλ€. μ£Ό μΈλμμμ GCλ 'Major GC' λλ 'Full GC'λΌκ³ νλ©°, λ μ€λ κ±Έλ¦¬κ³ μ μ μΈλλ³΄λ€ λ μμ£Ό λ°μν©λλ€.
- κ°λΉμ§ 컬λ ν°μ μ’ λ₯: μλ°λ λ€μν κ°λΉμ§ 컬λ ν°λ₯Ό μ 곡ν©λλ€. μλ₯Ό λ€μ΄, Serial GC, Parallel GC, CMS(Concurrent Mark-Sweep) GC, G1(Garbage-First) GC λ±μ΄ μμΌλ©°, κ°κ°μ GCλ μλ‘ λ€λ₯Έ μ±λ₯ νΉμ±κ³Ό μ ν리μΌμ΄μ μꡬ μ¬νμ λ§μΆ° μ¬μ©λ©λλ€.
μλ°μ JVMμ λν μ€λͺ
μλ°μ JVMμ μλ° μ ν리μΌμ΄μ
μ μ€νμν€λ 무λλΌκ³ ν μ μμ΅λλ€. μλ°λ‘ μμ±λ λͺ¨λ νλ‘κ·Έλ¨μ JVM μμμ μ€νλμ£ . JVM λλΆμ μλ°λ 'ν λ² μμ±νλ©΄ μ΄λμλ μ€νν μ μλ€'λ ν° μ₯μ μ κ°κ³ μμ΅λλ€. μλ° μ½λλ λ°μ΄νΈμ½λλ‘ μ»΄νμΌλκ³ , μ΄ λ°μ΄νΈμ½λκ° λ€μν νλ«νΌμμ μ€νλ μ μκ² JVMμ΄ κΈ°κ³μ΄λ‘ λ³νν΄ μ€ννλ κ±°μ£ .
κ·Έλ¦¬κ³ JVMμ λ©λͺ¨λ¦¬ κ΄λ¦¬, κ°λΉμ§ 컬λ μ
κ°μ μ€μν μ
무λ λ΄λΉν©λλ€. μ΄λ‘ μΈν΄ κ°λ°μλ€μ νλ«νΌμ ꡬμ λ°μ§ μκ³ , λ©λͺ¨λ¦¬ κ΄λ¦¬μ μ κ²½ μ°μ§ μκ³ λ ν¨μ¨μ μΌλ‘ κ°λ°ν μ μμ΄μ. νμ§λ§ JVM μ€μ μ΄ μ ν리μΌμ΄μ
μ μ±λ₯μ ν° μν₯μ λ―ΈμΉκΈ° λλ¬Έμ, JVMμ λν μ΄ν΄λ μ€μν©λλ€. μ΄ κ³Όμ μμ μλ°μ ν΅μ¬ μμΉμΈ "Write Once, Run Anywhere"μ μ€νν©λλ€. JVM λλΆμ κ°λ°μλ€μ μ΄μ 체μ λ νλμ¨μ΄μ ꡬμ λ°μ§ μκ³ μ ν리μΌμ΄μ
μ κ°λ°νκ³ λ°°ν¬ν μ μμ΅λλ€.
- νλ«νΌ λ 립μ±: μλ° μμ€ μ½λλ λ¨Όμ λ°μ΄νΈμ½λλ‘ μ»΄νμΌλ©λλ€. μ΄ λ°μ΄νΈμ½λλ μ΄λ€ JVMμμλ μ€νλ μ μμΌλ―λ‘, μλ° νλ‘κ·Έλ¨μ λ€μν μ΄μ 체μ μ νλμ¨μ΄ νλ«νΌμμ λμΌνκ² μ€νλ μ μμ΅λλ€.
- ν΄λμ€ λ‘λ(Class Loader): JVMμ ν΄λμ€ λ‘λλ₯Ό μ¬μ©ν΄ λ°μ΄νΈμ½λλ₯Ό λ°νμ μ λ©λͺ¨λ¦¬λ‘ λ‘λν©λλ€. ν΄λμ€ λ‘λλ μλ° ν΄λμ€ νμΌ(.class)μ λΆλ¬μ JVMμ λ©λͺ¨λ¦¬ μμμ μ μ¬νλ μν μ ν©λλ€.
- λ°νμ λ°μ΄ν° μμ: JVMμ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μν΄ μ¬λ¬ λ°νμ λ°μ΄ν° μμμ μ μ§ν©λλ€. μ΄ μμμλ λ©μλ μμ(Method Area), ν(Heap), μ€ν(Stack), νλ‘κ·Έλ¨ μΉ΄μ΄ν°(Program Counter) λ±μ΄ ν¬ν¨λ©λλ€.
- μ€ν μμ§(Execution Engine): λ°μ΄νΈμ½λλ μ€ν μμ§μ μν΄ κΈ°κ³μ΄λ‘ ν΄μλμ΄ μ€νλ©λλ€. μ€ν μμ§μλ μΈν°ν리ν°μ JIT(Just-In-Time) μ»΄νμΌλ¬κ° ν¬ν¨λμ΄ μμ΅λλ€.
- μΈν°ν리ν°: λ°μ΄νΈμ½λλ₯Ό ν μ€μ© μ½μ΄μ μ€νν©λλ€. μ΄ κ³Όμ μ λ리μ§λ§, κ° λͺ λ Ήμ΄μ μ€νμ μ νν μ μ΄ν μ μμ΅λλ€.
- JIT μ»΄νμΌλ¬: λ°μ΄νΈμ½λμ μ±λ₯μ ν₯μμν€κΈ° μν΄, λ°νμμ λ°μ΄νΈμ½λμ μΌλΆλ₯Ό μ§μ μ€ν κ°λ₯ν κΈ°κ³μ΄λ‘ μ»΄νμΌν©λλ€. μ΄λ νλ‘κ·Έλ¨μ μ€ν μλλ₯Ό κ°μ ν©λλ€.
- κ°λΉμ§ 컬λ ν°(Garbage Collector): JVMμ κ°λΉμ§ 컬λ ν°λ λ μ΄μ μ°Έμ‘°λμ§ μλ κ°μ²΄λ₯Ό μλμΌλ‘ κ°μ§νκ³ , μ΄λ₯Ό λ©λͺ¨λ¦¬μμ μ κ±°ν©λλ€. μ΄λ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό λ¨μννκ³ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§ν©λλ€.
- λ€μ΄ν°λΈ λ©μλ μΈν°νμ΄μ€(Native Method Interface): μλ° νλ‘κ·Έλ¨μ΄ μ΄μ 체μ μ λ€μ΄ν°λΈ λΌμ΄λΈλ¬λ¦¬(μ: C, C++ λΌμ΄λΈλ¬λ¦¬)μ μνΈ μμ©ν μ μκ² ν΄μ€λλ€.
- λ€μ΄ν°λΈ λΌμ΄λΈλ¬λ¦¬: JVMμ μλ° νλ‘κ·Έλ¨μ΄ νμλ‘ νλ νΉμ κΈ°λ₯μ μ 곡νκΈ° μν΄ μ΄μ 체μ μ λ€μ΄ν°λΈ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν©λλ€.