μμ μ GC(Garbage Collection) μ λν΄ κ°λ¨ν μ 리ν μ μ΄ μμ§λ§, λ΄μ©μ΄ λ€μ μμλ κ² κ°μ μ΄λ²μ λ€μ κΉμ΄ μκ² μ 리ν΄λ³΄λ € νλ€. GCλ μλ° λ©λͺ¨λ¦¬ κ΄λ¦¬μμ λ§€μ° μ€μν κ°λ μ΄κΈ° λλ¬Έμ΄λ€.
μλ°μ Garbage Collection(GC) μ JVMμ΄ λ©λͺ¨λ¦¬λ₯Ό μλμΌλ‘ κ΄λ¦¬νκΈ° μν ν΅μ¬ λ©μ»€λμ¦μ΄λ€.
μ΄ κ°λ μ μ λλ‘ μ΄ν΄νλ €λ©΄ λ¨Όμ JVMμ ꡬ쑰μ λ©λͺ¨λ¦¬ μμμ λν΄ μμλ νμκ° μλ€.
μ°μ JVM λμ ꡬ쑰μ λν΄ μ 리ν λ €κ³ νλ€.

κ°λ°μκ° μμ€μ½λλ₯Ό μμ±νλ©΄, μ»΄νμΌλ¬κ° μ΄λ₯Ό λ°μ΄νΈμ½λ(Bytecode) λ‘ λ³ννλ€.
μ΄ν ν΄λμ€ λ‘λ(Class Loader) κ° λμ λ‘λ©(Dynamic Loading) μ ν΅ν΄ νμν ν΄λμ€λ€μ Runtime Data Area(νλ‘κ·Έλ¨ μ€ν μ μ€μ λ©λͺ¨λ¦¬κ° ν λΉλλ μμ)μ λ‘λνκ³ λ§ν¬νλ€.
Runtime Data Areaμ λ‘λλ λ°μ΄νΈμ½λλ Execution Engine(μ€ν μμ§) μ μν΄ ν΄μλμ΄ μ€νλλ€.
μ΄ κ³Όμ μμ Execution Engine μ Garbage Collector(GC) λ₯Ό λμμμΌ λ©λͺ¨λ¦¬λ₯Ό μλμΌλ‘ κ΄λ¦¬νκ³ , λμμ μ€λ λ λκΈ°ν(Thread Synchronization) λ±μ μμ λ μννλ€.

μ΄μ²λΌ JVMμ μλμ κ°μ΄ ꡬμ±λμ΄ μλ€.
ν΄λμ€ λ‘λ(Class Loader)
μ€ν μμ§(Execution Engine)
λ°νμ λ°μ΄ν° μμ (Runtime Data Area)
JNI - λ€μ΄ν°λΈ λ©μλ μΈν°νμ΄μ€ (Native Medthod Interface)
λ€μ΄ν°λΈ λ©μλ λΌμ΄λΈλ¬λ¦¬ (Native Method Library)
ν΄λμ€ λ‘λ(Class Loader)λ λ‘λ©, λ§ν¬, μ΄κΈ°ν λ¨κ³λ‘ λλμ΄μ Έ μλ€.
μλ° λ°μ΄νΈ μ½λ(.class)λ κΈ°κ³κ° λ°λ‘ μνν μ μλ μΈμ΄λ³΄λ€λ κ°μ λ¨Έμ μ΄ μ΄ν΄ν μ μλ μ€κ° λ λ²¨λ‘ μ»΄νμΌ λ μ½λμ΄κΈ° λλ¬Έμ μ€ν μμ§(Execution Engine)μ΄ κΈ°κ³κ° μ€ν ν μ μλ ννλ‘ λ³κ²½ν΄μ€λ€.
μ€ν μμ§(Execution Engine)μ μΈν°ν리ν°μ JIT μ»΄νμΌλ¬ λκ°μ§ λ°©μμ νΌν©νμ¬ λ°μ΄νΈ μ½λλ₯Ό μ€ννλ€.
π€ C, C++ κ°μ μΈμ΄λ μ»΄νμΌλ¬λ₯Ό ν΅ν΄ κΈ°κ³μ΄λ‘ μ§μ λ³νλλ―λ‘, μΈν°νλ¦¬ν° μμ΄ μ€ν μλκ° λΉ λ₯΄λ€.
μΈν°ν리ν°(Interpreter)μ λ¨μ μ 보μνκΈ° μν΄ λμ λ λ°©μμΌλ‘ λ°λ³΅ μ½λκ° λ°κ²¬λλ©΄ λ°μ΄νΈ μ½λ μ 체λ₯Ό μ»΄νμΌ νμ¬ Native Codeλ‘ λ³κ²½νκ³ μ΄νμλ ν΄λΉ λ©μλλ₯Ό λ μ΄μ μΈν°νλ¦¬νΈ νμ§ μκ³ μΊμ± ν΄λμλ€κ° Native Codeλ‘ μ§μ μ€ννλ λ°©μμ΄λ€.
μ€ν μλκ° μΈν°ν리ν°(Interpreter)λ³΄λ€ λΉ λ₯΄λ€.
π€ Native Codeλ, CPUκ° μ§μ μ€νν μ μλ κΈ°κ³μ΄ μ½λ(Machine Code)λ₯Ό μλ―Ένλ€.

JVM(Java Virtual Machine)μ Garbage Collectorλ₯Ό ν΅ν΄ Heap λ©λͺ¨λ¦¬ μμμμ λμ΄μ μ¬μ©νμ§ μλ λ©λͺ¨λ¦¬λ₯Ό μλμΌλ‘ νμν΄μ€λ€. μ΄ λΆλΆμ λ€μμ λ μμΈνκ² μ 리ν λ €κ³ νλ€.

JVM(Java Virtual Machine)μ λ©λͺ¨λ¦¬ μμμΌλ‘ μλ° μ ν리μΌμ΄μ μ μ€νν λ, μ¬μ©λλ λ°μ΄ν°λ€μ μ μ¬νλ μμμ΄λ€.

Heapμμμ λ©μλ μμκ³Ό ν¨κ» λͺ¨λ μ€λ λκ° κ³΅μ νλ©°, JVMμ΄ κ΄λ¦¬νλ νλ‘κ·Έλ¨ μμμ λ°μ΄ν°λ₯Ό μ μ₯νκΈ° μν΄ λ°νμ μ λμ μΌλ‘ ν λΉνμ¬ μ¬μ©νλ μμμ΄λ€.
μ¦, new μ°μ°μλ‘ μμ±λλ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ, λ°°μ΄ νμλ± Reference Typeμ΄ μ μ₯λλ κ³³μ΄λ€.

μ μν μ μ, ν(Heap) μμμ μμ±λ κ°μ²΄μ λ°°μ΄μ λͺ¨λ μ°Έμ‘° νμ (Reference Type) μΌλ‘μ, JVM μ€ν(Stack) μμμ λ³μλ λ€λ₯Έ κ°μ²΄μ νλμμ μ°Έμ‘°λλ€λ μ μ΄λ€.
μ¦, νμ μμ±λ κ°μ²΄μ μ°Έμ‘° μ£Όμλ μ€νμ΄ κ°μ§κ³ μμΌλ©°, μ€νμ μλ μ°Έμ‘° λ³μλ₯Ό ν΅ν΄μλ§ ν μμμ μΈμ€ν΄μ€μ μ κ·Όνκ³ μ‘°μν μ μλ€.
λ€μ λ§ν΄, νμ κ°μ²΄λ μ€νμ μ°Έμ‘° νμ λ³μμ μ°κ²°λμ΄ μλ ꡬ쑰μ΄λ€.
μλ₯Ό λ€μ΄ κ·Έλ¦Όμ 보면, μ€νμλ name, party, birth, weight λ€ κ°μ λ³μκ° μ‘΄μ¬νλ€.
μ΄ μ€ birth(200406)μ weight(3.5)λ κΈ°λ³Έ νμ μΌλ‘ μ€ν μμ κ°μ΄ μ§μ μ μ₯λμ΄ μμ§λ§,
nameκ³Ό partyλ μ°Έμ‘° νμ μΌλ‘ κ°κ° 100λ²μ§μ 200λ²μ§μ μ£Όμκ°λ§ κ°μ§κ³ μλ€.
μ΄ μ£Όμλ₯Ό λ°λΌκ°λ©΄ ν μμμ "μ¬λ리"(100λ²μ§)μ "κ°μμ§"(200λ²μ§) κ°μ²΄λ₯Ό μ°Ύμ μ μλ€.
μ¦, μ€νμ name λ³μλ₯Ό ν΅ν΄μλ§ νμ μλ "μ¬λ리" κ°μ²΄λ₯Ό μ‘°μν μ μκ³ , party λ³μ μμ "κ°μμ§" κ°μ²΄λ₯Ό μ°Έμ‘°νκ³ μλ κ²μ΄λ€.
κ·Έλ°λ° λ§μ½ name λ³μλ₯Ό μ κ±°νκ±°λ λ€λ₯Έ κ°μ²΄λ₯Ό μ°Έμ‘°νκ² λλ©΄ νμ "μ¬λ리" κ°μ²΄λ λ μ΄μ μ΄λ€ λ³μμμλ μ°Έμ‘°λμ§ μκ² λλ€.
μ΄λ κ² μ°Έμ‘°νλ μ€ν λ³μλ νλκ° μ¬λΌμ§ κ°μ²΄λ μλ―Έ μλ λ°μ΄ν°κ° λμ΄ μ°λ κΈ° κ°μ²΄(Garbage Object) λ‘ μ·¨κΈλλ€.
μ΄λ JVMμ κ°λΉμ§ 컬λ ν°(Garbage Collector) λ₯Ό μ€ννμ¬ μ΄λ° μ°λ κΈ° κ°μ²΄λ₯Ό ν μμμμ μλμΌλ‘ μ κ±°ν¨μΌλ‘μ¨ λΆνμν λ©λͺ¨λ¦¬λ₯Ό μ 리νκ³ ν¨μ¨μ μΌλ‘ κ΄λ¦¬νλ€.
π€ GCλ₯Ό μλμ μΌλ‘ System.gc()λ₯Ό μ¬μ©νμ¬ νΈμΆ κ°λ₯νμ§λ§, μ€λ²ν€λκ° κ΅μ₯ν ν¬λ―λ‘ Garbage Collectorμκ² λ©λͺ¨λ¦¬ ν΄μ λ₯Ό λ―Ώκ³ λ§‘κΈ°λκ±Έ μΆμ²

μ΄μ²λΌ Heapμμμ κ°λΉμ§ 컬λ μ (GC) λμμ΄ λλ 곡κ°μ΄κ³ , ν¨μ¨μ μΈ κ°λΉμ§ 컬λ μ (GC)μ μννκΈ° μν΄ ν¬κ² Young Generation, Old GenerationμΌλ‘ λλλ€.
μλͺ μ£ΌκΈ°κ° μ§§μ κ°μ²΄λ₯Ό κ°λΉμ§ 컬λ μ (GC) λμμΌλ‘ νλ μμ
μλͺ μ£ΌκΈ°κ° κΈ΄ κ°μ²΄λ₯Ό GCλμμΌλ‘ νλ μμ, Young Generationμμ λ§μ§λ§κΉμ§ μ΄μλ¨μ κ°μ²΄κ° μ΄λ
π€ μ κ΅³μ΄ Young Generationκ³Ό Old GenerationμΌλ‘ λλ΄μκΉ?
GC μ€κ³μλ€μ μ ν리μΌμ΄μ μ λΆμν κ²°κ³Ό, λλΆλΆμ κ°μ²΄κ° μλͺ μ΄ μ§§λ€λ μ¬μ€μ λ°κ²¬νλ€. GCλ μ€ν μμ²΄κ° λΉμ©μ΄ λλ μμ μ΄λ―λ‘, λ©λͺ¨λ¦¬ μ 체λ₯Ό νμν기보λ€λ νΉμ μμλ§ κ²μ¬νμ¬ ν΄μ νλ κ²μ΄ ν¨μ¨μ μ΄λ€. λ°λΌμ μλμ μΌλ‘ κΈλ°© μ¬λΌμ§λ κ°μ²΄κ° λ§μ Young Generationμμ μ°μ μ μΌλ‘ λ©λͺ¨λ¦¬λ₯Ό νμνλλ‘ μ€κ³λμλ€.
1. Reference Counting

κ·Έλ¦Όμμ Root Spaceλ μ€ν λ³μλ μ μ λ³μμ²λΌ νμ μλ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ μμμ μν μ νλ 곡κ°μ΄λ€.
Reference Counting λ°©μμμλ νμ μλ κ° κ°μ²΄κ° μ°Έμ‘°λλ νμ(reference count)λ₯Ό κ°μ§κ³ μλ€κ³ μκ°νλ©΄ λλ€. μ΄ μ«μλ ν΄λΉ κ°μ²΄μ μ κ·Όν μ μλ κ²½λ‘κ° λͺ κ°μΈμ§λ₯Ό λνλΈλ€. λ§μ½ μ°Έμ‘° νμκ° 0μ΄ λλ©΄, λ μ΄μ κ°μ²΄μ μ κ·Όν μ μμΌλ―λ‘ λ©λͺ¨λ¦¬μμ ν΄μ λλ€. Swiftκ° μ΄ λ°©μμ μ¬μ©ν΄ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬νλ€.
νμ§λ§ Reference Countingμ μν μ°Έμ‘°(Circular Reference) λ¬Έμ λ₯Ό κ°μ§ μ μλ€. μλ₯Ό λ€μ΄, Root Spaceμμ λͺ¨λ ν κ°μ²΄μ λν μ°Έμ‘°λ₯Ό λμ΄λ, μλ‘ μ°Έμ‘°νκ³ μλ κ°μ²΄λ€μ΄ μλ€λ©΄ κ·Έλ€μ reference countλ 0μ΄ λμ§ μκ³ κ·Έλλ‘ λ¨λλ€. κ·Έλ¦Ό μ λ Έλμ κ³ λ¦¬ μμ κ°μ²΄λ€μ΄ μ΄λ° κ²½μ°λ€. κ²°κ³Όμ μΌλ‘ λ μ΄μ μ¬μ©νμ§ μλ κ°μ²΄μμλ λ©λͺ¨λ¦¬μμ ν΄μ λμ§ μμ λ©λͺ¨λ¦¬ λμκ° λ°μνλ€.
2. Mark and Sweep
Mark and Sweep μκ³ λ¦¬μ¦μ Root Spaceμμ μμν΄ κ°μ²΄μ μ κ·Όν μ μλμ§ μ¬λΆλ₯Ό κΈ°μ€μΌλ‘ λ©λͺ¨λ¦¬λ₯Ό ν΄μ νλ€.
Root Spaceμμ μ°κ²°λ κ°μ²΄λ₯Ό νμ(Mark)νκ³ , μ°κ²°λμ§ μμ κ°μ²΄λ μ κ±°(Sweep)νλ€. Root Spaceμμ λΏμ μ μλ κ°μ²΄λ Reachable, λΏμ μ μλ κ°μ²΄λ Unreachableλ‘ κ΅¬λΆλλ€.
Mark and Sweep λ°©μμ μ¬μ©νλ©΄ Reference Counting λ°©μμμ λ¬Έμ κ° λλ μν μ°Έμ‘° κ°μ²΄λ μμ νκ² μ κ±°ν μ μλ€. μ€μ λ‘ Javaμ JavaScriptκ° μ΄ λ°©μμ μ¬μ©ν΄ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬νλ€.
νμ§λ§ λ¨μ λ μλ€. Reference Countingμ²λΌ κ°μ²΄κ° νμ μμ΄μ§ μ¦μ μ§μμ§μ§ μκ³ , GCλ₯Ό νΉμ μμ μ μ€νν΄μΌ νλ€λ μ μ΄λ€. μ¦, μ ν리μΌμ΄μ μ΄ μ€νλλ λμ GCκ° λ¦¬μμ€λ₯Ό μ¬μ©νλ―λ‘, μ±λ₯κ³Ό μ¬μ©μ κ²½νμ κ³ λ €ν΄ μ μ ν GCλ₯Ό μ€ννλ μ λ΅μ΄ νμνλ€.
Mark and Sweepκ³Ό JVM GC νΉμ§ μμ½
Mark and Sweep λ°©μμμλ μ ν리μΌμ΄μ κ³Ό GCκ° λμμ μ€νλ μ μλ€.
Serial GC
Parallel GC
CMS GC (Concurrent-Mark-Sweep)
G1 GC (Garbage First)
π€ GC μ€νμ μν΄ μ ν리μΌμ΄μ μ λ©μΆλ κ²μ Stop The World(STW)λΌκ³ νλ€.
κ° μ€λ λλ§λ€ μμ±λλ μ€λ λ μ μ© μμ
λ©μλ νΈμΆ μ μμ±λλ νλ μ(Frame) μ μ μ₯νκ³ , μ§μ λ³μ, λ§€κ°λ³μ, μ°μ° μ€κ° κ° λ±μ κ΄λ¦¬
λ©μλκ° μ’ λ£λλ©΄ ν΄λΉ νλ μμ μ κ±°λ¨
κ° μ€λ λλ§λ€ λ 립μ μΌλ‘ μ‘΄μ¬
νμ¬ μ€ν μ€μΈ JVM λͺ λ Ήμ΄ μ£Όμ(Program Counter) λ₯Ό κ°λ¦¬ν΄.
λ©μλ νΈμΆκ³Ό λ³΅κ· μ JVMμ΄ μ΄λμ μ€ν μ€μΈμ§ μΆμ νλ μ©λλ‘ μ¬μ©
C/C++λ‘ μμ±λ λ€μ΄ν°λΈ λ©μλ(Native Method)λ₯Ό μν μ€ν μμ
JVM λ΄λΆμμ Javaκ° μλ μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό νΈμΆν λ μ¬μ©
μ€λ λλ§λ€ λ 립μ μΌλ‘ μ‘΄μ¬νλ©°, λ‘컬 λ³μμ νΈμΆ μ 보λ₯Ό κ΄λ¦¬
μ°Έκ³