--- id: P-REINFORCE-AUTO-CA2F39 category: "10_Wiki/πŸ’‘ Topics/Programming & Language" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - Garbage Collection(κ°€λΉ„μ§€ μ»¬λ ‰μ…˜)" --- # [[Garbage Collection(α„€α…‘α„‡α…΅α„Œα…΅ ᄏα…₯ᆯ렉션)|Garbage Collection(κ°€λΉ„μ§€ μ»¬λ ‰μ…˜)]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(Garbage Collection)은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”λͺ¨λ¦¬ κ³ κ°ˆμ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ 더 이상 ν•„μš”ν•˜μ§€ μ•Šκ±°λ‚˜ 도달할 수 μ—†λŠ” 객체가 μ°¨μ§€ν•œ λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ μ‹λ³„ν•˜μ—¬ νšŒμˆ˜ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€ [1-3]. 이 κΈ°μˆ μ€ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 직접 λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•˜λŠ” 뢀담을 λœμ–΄μ£Όκ³  λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ™€ 같은 였λ₯˜λ₯Ό μ€„μ—¬μ£Όμ§€λ§Œ, λ©”λͺ¨λ¦¬ 정리 μž‘μ—… 쀑 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 싀행이 λ©ˆμΆ”λŠ” 'Stop-the-world' 지연을 λ°œμƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€ [2, 4, 5]. ν˜„λŒ€μ˜ κ°€λΉ„μ§€ 컬렉터듀은 μ΄λŸ¬ν•œ μ§€μ—° μ‹œκ°„μ„ μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ μ„ΈλŒ€λ³„ νž™ ꡬ쑰(Generational Layout)와 병렬 및 λ™μ‹œ 처리 μ•Œκ³ λ¦¬μ¦˜μ„ λ„μž…ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€ [6-8]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) - **생쑴 객체 식별 원리 (Discovering Reachability)** κ°€λΉ„μ§€ 컬렉터가 ν•΄κ²°ν•΄μ•Ό ν•  핡심 λ¬Έμ œλŠ” 죽은 λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ‹λ³„ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€ [1]. 객체의 미래 μ ‘κ·Ό μ—¬λΆ€λ₯Ό μ™„λ²½νžˆ μ˜ˆμΈ‘ν•˜λŠ” 것은 μ •μ§€ 문제(Halting Problem)와 κ°™μ•„ λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ, GCλŠ” μŠ€νƒμ˜ 둜컬 λ³€μˆ˜λ‚˜ κΈ€λ‘œλ²Œ 객체와 같은 '루트(Root) 객체'λΆ€ν„° μ‹œμž‘ν•˜μ—¬ 포인터 체인을 톡해 도달할 수 μžˆλŠ” κ°μ²΄λ§Œμ„ '생쑴(Live)' μƒνƒœλ‘œ κ·Όμ‚¬ν•˜μ—¬ νŒλ‹¨ν•˜κ³ , 도달 λΆˆκ°€λŠ₯ν•œ λͺ¨λ“  객체λ₯Ό 'κ°€λΉ„μ§€(Garbage)'둜 κ°„μ£Όν•©λ‹ˆλ‹€ [1, 9, 10]. - **μ„ΈλŒ€λ³„ κ°€μ„€κ³Ό νž™ λ©”λͺ¨λ¦¬ ꡬ쑰 (Generational Collection & Heap Organization)** λŒ€λΆ€λΆ„μ˜ κ°μ²΄λŠ” 생성 ν›„ μ–Όλ§ˆ μ§€λ‚˜μ§€ μ•Šμ•„ μ£½λŠ”λ‹€λŠ” 'μ„ΈλŒ€λ³„ κ°€μ„€(Generational Hypothesis)'을 기반으둜, V8κ³Ό 같은 엔진은 νž™ λ©”λͺ¨λ¦¬λ₯Ό μ„ΈλŒ€λ³„λ‘œ λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•©λ‹ˆλ‹€ [6, 11, 12]. * **New Space (Young Generation):** λŒ€λΆ€λΆ„μ˜ μƒˆ 객체가 ν• λ‹Ήλ˜λŠ” μž‘κ³  λΉ λ₯Έ κ³΅κ°„μž…λ‹ˆλ‹€ [6, 13]. 주기적으둜 λ§ˆμ΄λ„ˆ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ΄ λΉ λ₯΄κ²Œ μˆ˜ν–‰λ©λ‹ˆλ‹€ [6]. * **Old Space (Old Generation):** New Spaceμ—μ„œ μˆ˜ν–‰λœ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ„ 두 번 살아남은 객체듀이 승격(Promotion)λ˜μ–΄ μ΄λ™ν•˜λŠ” κ³΅κ°„μž…λ‹ˆλ‹€ [6, 14, 15]. - **λ§ˆμ΄λ„ˆ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ (Scavenger)** Young Generation을 κ΄€λ¦¬ν•˜λŠ” 고속 μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€ [16, 17]. New Spaceλ₯Ό 'To-Space'와 'From-Space'λΌλŠ” λ™μΌν•œ 크기의 두 λ°˜κ³΅κ°„(Semi-space)으둜 λΆ„ν• ν•˜λŠ” Cheney의 μ•Œκ³ λ¦¬μ¦˜(Scavenge)을 μ‚¬μš©ν•©λ‹ˆλ‹€ [16, 18]. ν• λ‹Ή 곡간이 가득 μ°¨λ©΄, ν™œμ„± 객체λ₯Ό μΆ”μ ν•˜μ—¬ 빈 곡간(To-Space)μ΄λ‚˜ Old Space둜 λŒ€ν”Ό(Evacuate)μ‹œν‚€λ©΄μ„œ λ©”λͺ¨λ¦¬λ₯Ό μ••μΆ•ν•©λ‹ˆλ‹€ [18, 19]. 이후 남은 From-Space의 μ“°λ ˆκΈ° 데이터λ₯Ό ν•œ λ²ˆμ— λΉ„μš°κ³  두 κ³΅κ°„μ˜ 역할을 λ°”κΏ‰λ‹ˆλ‹€ [18, 19]. - **메이저 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ (Mark-Sweep-Compact)** 수백 λ©”κ°€λ°”μ΄νŠΈμ˜ 데이터λ₯Ό 포함할 수 μžˆλŠ” Old Spaceλ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ 메이저 GCλŠ” 주둜 μ„Έ κ°€μ§€ 단계λ₯Ό κ±°μΉ©λ‹ˆλ‹€ [20, 21]. * **Marking (ν‘œμ‹œ):** 깊이 μš°μ„  탐색(DFS)을 톡해 νž™ λ‚΄μ˜ ν™œμ„± 객체λ₯Ό λ°œκ²¬ν•©λ‹ˆλ‹€ [22]. 객체λ₯Ό 흰색(미발견), νšŒμƒ‰(λ°œκ²¬λ˜μ—ˆμœΌλ‚˜ 이웃 객체 미처리), 검은색(발견 및 이웃 처리 μ™„λ£Œ)의 3색 λ§ˆν‚Ή μƒνƒœλ‘œ λΆ„λ₯˜ν•˜μ—¬ μΆ”μ ν•©λ‹ˆλ‹€ [23, 24]. * **Sweeping (μ“ΈκΈ°):** λ§ˆν‚Ήλ˜μ§€ μ•Šμ€ 죽은 객체의 μ—°μ†λœ λ©”λͺ¨λ¦¬ λ²”μœ„λ₯Ό μŠ€μΊ”ν•˜μ—¬ Free list(μ—¬μœ  곡간)둜 λ³€ν™˜ν•˜μ—¬ 후속 할당에 λŒ€λΉ„ν•©λ‹ˆλ‹€ [24-26]. * **Compacting (μ••μΆ•):** λ©”λͺ¨λ¦¬ λ‹¨νŽΈν™”(Fragmentation)λ₯Ό 쀄이기 μœ„ν•΄ 생쑴 객체듀을 빈 κ³΅κ°„μœΌλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•©λ‹ˆλ‹€ [24, 27, 28]. μ΄λŠ” λΉ„μš©μ΄ 많이 λ“œλŠ” μž‘μ—…μ΄μ§€λ§Œ μ‹€μ œ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ λŒ€ν­ μ€„μ—¬μ€λ‹ˆλ‹€ [27, 29]. - **ν˜„λŒ€ GC의 μ„±λŠ₯ μ΅œμ ν™” (Orinoco λ“±)** 수백 λ°€λ¦¬μ΄ˆμ— λ‹¬ν•˜λ˜ 과거의 'Stop-the-world' μΌμ‹œ μ •μ§€ ν˜„μƒμ„ 쀄이기 μœ„ν•΄ ν˜„λŒ€μ μΈ GCλŠ” λ‹€μ–‘ν•œ 기법을 λ™μ›ν•©λ‹ˆλ‹€ [30, 31]. * **Parallel (병렬 처리):** 메인 μŠ€λ ˆλ“œμ™€ μ—¬λŸ¬ 보쑰 μŠ€λ ˆλ“œκ°€ GC μž‘μ—…μ„ λ™μ‹œμ— λΆ„λ‹΄ν•˜μ—¬ 총 μ •μ§€ μ‹œκ°„μ„ μ€„μž…λ‹ˆλ‹€ [32, 33]. * **Incremental (점진적 처리):** μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ 쀑간쀑간에 μž‘μ€ λ‹¨μœ„λ‘œ GC μž‘μ—…μ„ λ²ˆκ°ˆμ•„ μˆ˜ν–‰(Interleaving)ν•˜μ—¬ 응닡성을 μœ μ§€ν•©λ‹ˆλ‹€ [30, 32, 34]. * **Concurrent (λ™μ‹œ 처리):** 메인 μŠ€λ ˆλ“œκ°€ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 계속 μ‹€ν–‰ν•˜λŠ” λ™μ•ˆ 보쑰 μŠ€λ ˆλ“œλ“€μ΄ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ „μ μœΌλ‘œ Marking 및 Sweeping μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€ [7, 32, 35]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[Mark-Sweep|Mark-Sweep]], [[Scavenger α„‹α…‘α†―α„€α…©α„…α…΅α„Œα…³α†·|Scavenger]], [[Stop-the-world|Stop-the-world]], [[Generational Hypothesis|Generational Hypothesis]], [[Memory Leak|Memory Leak]] - **Projects/Contexts:** [[V8 JavaScript Engine|V8 JavaScript Engine]], IBM Eclipse OpenJ9, Orinoco Garbage Collector - **Contradictions/Notes:** κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ€ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λŒ€ν­ μ€„μ—¬μ£Όμ§€λ§Œ, ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λ©”λͺ¨λ¦¬ 관리에 λŒ€ν•œ 전적인 ν†΅μ œκΆŒμ„ μžƒλŠ”λ‹€λŠ” 단점이 μ‘΄μž¬ν•©λ‹ˆλ‹€(λͺ¨λ°”일 μ•± λ“±μ—μ„œλŠ” 큰 문제점) [4, 5]. λ˜ν•œ λŒ€μ•ˆμœΌλ‘œ κ±°λ‘ λ˜λŠ” 레퍼런슀 μΉ΄μš΄νŒ…(Reference Counting) 방식 μ—­μ‹œ λŒ€κ·œλͺ¨ 객체 κ·Έλž˜ν”„μ˜ λ§ˆμ§€λ§‰ μ°Έμ‘°κ°€ 제거될 λ•Œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜κ³Ό μœ μ‚¬ν•œ 예츑 λΆˆκ°€λŠ₯ν•œ μ •μ§€ ν˜„μƒμ„ μœ λ°œν•  수 μžˆμ–΄ μ™„λ²½ν•œ λŒ€μ²΄μž¬λŠ” μ•„λ‹™λ‹ˆλ‹€ [5]. --- *Last updated: 2026-04-19* - Raw Source: 00_Raw/2026-04-20/Garbage Collection(κ°€λΉ„μ§€ μ»¬λ ‰μ…˜).md ---