--- id: [[P-Reinforce|P-Reinforce]]-AUTO-488812 category: "10_Wiki/πŸ’‘ Topics/Programming & Language" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - V8 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜([[Garbage Collection|Garbage Collection]])" --- # [[V8 α„€α…‘α„‡α…΅α„Œα…΅ ᄏα…₯ᆯ렉션(Garbage Collection)|V8 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(Garbage Collection]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > V8 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 죽은 λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ‹λ³„ν•˜κ³  운영체제둜 λ°˜ν™˜ν•˜κ±°λ‚˜ μž¬μ‚¬μš©ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€ [1]. κ°€λΉ„μ§€ μ»¬λ ‰ν„°λŠ” 루트(Root) κ°μ²΄μ—μ„œ μ‹œμž‘ν•˜λŠ” 포인터 체인을 톡해 도달할 수 μ—†λŠ” 객체λ₯Ό 죽은 객체(κ°€λΉ„μ§€)둜 κ°„μ£Όν•˜μ—¬ μ²˜λ¦¬ν•©λ‹ˆλ‹€ [1, 2]. V8은 λŒ€λ‹€μˆ˜μ˜ 객체가 일찍 μ£½λŠ”λ‹€λŠ” νŠΉμ„±μ„ ν™œμš©ν•˜μ—¬ νž™ λ©”λͺ¨λ¦¬λ₯Ό μ„ΈλŒ€λ³„λ‘œ λΆ„ν• ν•˜κ³ , 각 곡간에 μ΅œμ ν™”λœ λ§ˆμ΄λ„ˆ GC(Minor GC)와 메이저 GC([[Major GC|Major GC]])λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€ [3, 4]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) **νž™ λ©”λͺ¨λ¦¬ ꡬ쑰 (Heap Organization)** V8은 νž™μ„ 객체의 생쑴 κΈ°κ°„ 및 μš©λ„μ— 따라 μ—¬λŸ¬ κ³΅κ°„μœΌλ‘œ λΆ„ν• ν•©λ‹ˆλ‹€ [5]. - **New-space**: λŒ€λΆ€λΆ„μ˜ μƒˆλ‘œμš΄ 객체가 ν• λ‹Ήλ˜λŠ” μž‘κ³  λΉ λ₯Έ μ˜μ—­μž…λ‹ˆλ‹€ [5]. - **Old-space**: New-spaceμ—μ„œ 일정 μ‹œκ°„ 살아남은 객체듀이 μ΄λ™ν•˜λŠ” μ˜μ—­μœΌλ‘œ, λ‹€λ₯Έ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터가 ν¬ν•¨λœ 'Old-pointer-space'와 μ›μ‹œ λ°μ΄ν„°λ§Œ ν¬ν•¨λœ 'Old-data-space'둜 μ„ΈλΆ„ν™”λ©λ‹ˆλ‹€ [5]. - **κ·Έ μ™Έ 곡간**: 이 외에도 λŒ€μš©λŸ‰ 객체λ₯Ό μœ„ν•œ 'Large-object-space', μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μ €μž₯ν•˜λŠ” 'Code-space', 그리고 크기가 μΌμ •ν•œ λ‚΄λΆ€ 객체 관리λ₯Ό μœ„ν•œ 'Cell/Map-space' 등이 μ‘΄μž¬ν•©λ‹ˆλ‹€ [5]. 각 곡간은 μ—°μ†λœ λ©”λͺ¨λ¦¬ 청크인 μ—¬λŸ¬ 개의 νŽ˜μ΄μ§€(Page)둜 κ΅¬μ„±λ˜λ©°, 각 νŽ˜μ΄μ§€λŠ” 일반적으둜 1MB λ˜λŠ” 512KB의 크기둜 κ΄€λ¦¬λ©λ‹ˆλ‹€ [6, 7]. **포인터 식별 (Tagged Pointers)** κ°€λΉ„μ§€ 컬렉터가 νž™ λ‚΄μ—μ„œ μ‚΄μ•„μžˆλŠ” 객체λ₯Ό νƒμƒ‰ν•˜λ €λ©΄ 포인터와 일반 데이터λ₯Ό ꡬ뢄해야 ν•©λ‹ˆλ‹€ [8]. V8은 컴파일러의 μ œν•œμ μΈ μ§€μ›λ§ŒμœΌλ‘œλ„ 효율적으둜 식별이 κ°€λŠ₯ν•œ 'νƒœκ·Έλœ 포인터(Tagged pointers)' 방식을 μ‚¬μš©ν•©λ‹ˆλ‹€ [9]. 각 μ›Œλ“œμ˜ λ§ˆμ§€λ§‰ λΉ„νŠΈλ₯Ό μ˜ˆμ•½ν•˜μ—¬ 데이터와 포인터λ₯Ό κ΅¬λΆ„ν•˜λ―€λ‘œ κ°€λΉ„μ§€ 컬렉터가 객체 μŠ€μΊ” μ‹œ μ •μˆ˜λ₯Ό λ¬΄μ‹œν•˜κ³  ν¬μΈν„°λ§Œ λΉ λ₯΄κ²Œ λ”°λΌκ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€ [9, 10]. **μ„ΈλŒ€λ³„ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ (Generational Collection)** - **λ§ˆμ΄λ„ˆ GC ([[Scavenge|Scavenge]])**: New-spaceλ₯Ό κ΄€λ¦¬ν•˜λŠ” κ°€λΉ„μ§€ μ»¬λ ‰ν„°λ‘œ, ν• λ‹Ή 포인터가 New-space의 끝에 λ„λ‹¬ν•˜λ©΄ μ‹œμž‘λ©λ‹ˆλ‹€ [3, 11]. μ²΄λ‹ˆ(Cheney)의 μ•Œκ³ λ¦¬μ¦˜μ„ 기반으둜 New-spaceλ₯Ό 크기가 같은 두 개의 λ°˜κ³΅κ°„(To-space와 From-space)으둜 λ‚˜λˆ„μ–΄ μž‘λ™ν•©λ‹ˆλ‹€ [11, 12]. κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ΄ 트리거되면 μ‚΄μ•„μžˆλŠ” 객체만 To-space둜 λŒ€ν”Όμ‹œν‚€λ©°(볡사 및 μ••μΆ•), 두 번의 μ‚¬μ΄ν΄μ—μ„œ 살아남은 κ°μ²΄λŠ” Old-space둜 승격(Promote)μ‹œν‚΅λ‹ˆλ‹€ [11, 13]. - **메이저 GC ([[Mark-Sweep|Mark-Sweep]]-Compact)**: 크기가 큰 Old-space의 κ°€λΉ„μ§€λ₯Ό μˆ˜μ§‘ν•˜κΈ° μœ„ν•΄ λ§ˆν‚Ή(Marking), μŠ€μœ„ν•‘(Sweeping), μ••μΆ•(Compacting) 단계λ₯Ό κ±°μΉ©λ‹ˆλ‹€ [14]. λ§ˆν‚Ή λ‹¨κ³„μ—μ„œλŠ” νž™μ„ λ°©ν–₯μ„± κ·Έλž˜ν”„λ‘œ κ°„μ£Όν•˜μ—¬ 깊이 μš°μ„  탐색(DFS)을 μˆ˜ν–‰ν•˜κ³  객체 μƒνƒœλ₯Ό 흰색, νšŒμƒ‰, 검은색 λΉ„νŠΈλ‘œ ν‘œμ‹œν•©λ‹ˆλ‹€ [15, 16]. 이후 λ§ˆν‚Ήλ˜μ§€ μ•Šμ€ 죽은 객체의 μ˜μ—­μ„ μ°Ύμ•„ μ—¬μœ  κ³΅κ°„μœΌλ‘œ λ°˜ν™˜ν•˜λŠ” μŠ€μœ„ν•‘ μž‘μ—…μ΄λ‚˜, μ‚΄μ•„μžˆλŠ” 객체λ₯Ό λͺ¨μ•„ λ©”λͺ¨λ¦¬ λ‹¨νŽΈν™”λ₯Ό μ€„μ΄λŠ” μ••μΆ• μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€ [17, 18]. **[[Orinoco|Orinoco]]와 μ΅œμ‹  GC μ΅œμ ν™”** 과거의 κ°€λΉ„μ§€ μ»¬λ ‰ν„°λŠ” 메인 μŠ€λ ˆλ“œλ₯Ό λ©ˆμΆ”λŠ” '[[Stop-the-world|Stop-the-world]]' λ°©μ‹μœΌλ‘œ 인해 μ§€μ—° μ‹œκ°„μ΄ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€ [19]. V8은 Orinoco ν”„λ‘œμ νŠΈλ₯Ό 톡해 이 ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κ³  λ‹€μ–‘ν•œ μ΅œμ ν™” 기법을 λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€ [20, 21]. - **Parallel (병렬)**: 메인 μŠ€λ ˆλ“œμ™€ 헬퍼 μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ μž‘μ—…μ„ λΆ„λ‹΄ν•˜μ—¬ 총 μΌμ‹œ 쀑지 μ‹œκ°„μ„ μ€„μž…λ‹ˆλ‹€ [22]. - **Incremental (점진적)**: 메인 μŠ€λ ˆλ“œκ°€ JS μ‹€ν–‰ 쀑간쀑간에 μž‘μ€ 쑰각 λ‹¨μœ„λ‘œ λ§ˆν‚Ή μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ—¬ κΈ΄ λ©ˆμΆ€μ„ λ°©μ§€ν•©λ‹ˆλ‹€ [19, 23]. - **Concurrent (λ™μ‹œ)**: 메인 μŠ€λ ˆλ“œκ°€ JSλ₯Ό 계속 μ‹€ν–‰ν•˜λŠ” λ™μ•ˆ λ°±κ·ΈλΌμš΄λ“œμ˜ 헬퍼 μŠ€λ ˆλ“œκ°€ μ™„μ „νžˆ λ…λ¦½μ μœΌλ‘œ λ§ˆν‚Ή 및 μŠ€μœ„ν•‘μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€ [24, 25]. 메인 μŠ€λ ˆλ“œ μ‹€ν–‰ 쀑 객체 κ·Έλž˜ν”„κ°€ λ³€κ²½λ˜λŠ” λ¬Έμ œλŠ” μ“°κΈ° μž₯λ²½([[Write Barrier|Write Barrier]]s)을 톡해 μ§€μ†μ μœΌλ‘œ 변경사항을 μΆ”μ ν•˜μ—¬ ν•΄κ²°ν•©λ‹ˆλ‹€ [26, 27]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** μ„ΈλŒ€λ³„ κ°€μ„€([[Generational Hypothesis|Generational Hypothesis]]), 마크-μŠ€μœ„ν”„-컴팩트(Mark-Sweep-Compact), λ§ˆμ΄λ„ˆ GC(Scavenge), [[Orinoco α„€α…‘α„‡α…΅α„Œα…΅ ᄏα…₯ᆯ렉ᄐα…₯|Orinoco κ°€λΉ„μ§€ 컬렉터]] - **Projects/Contexts:** Node.js, [[Chrome|Chrome]] V8 μ—”μ§„, [[Orinoco α„‘α…³α„…α…©α„Œα…¦α†¨α„α…³|Orinoco ν”„λ‘œμ νŠΈ]] - **Contradictions/Notes:** μ†ŒμŠ€μ— λ”°λ₯΄λ©΄ 과거의 Scavenge μ•Œκ³ λ¦¬μ¦˜μ€ 동기식(Synchronous)인 μ²΄λ‹ˆ(Cheney) μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•˜μ˜€μœΌλ‚˜, Chromeκ³Ό Node.jsκ°€ κ΅¬λ™λ˜λŠ” ν˜„λŒ€μ˜ λ©€ν‹°μ½”μ–΄ ν™˜κ²½μ— λ°œλ§žμΆ”μ–΄ ν˜„μž¬μ˜ V8은 닀쀑 μŠ€λ ˆλ“œλ₯Ό ν™œμš©ν•΄ λ™μ μœΌλ‘œ μž‘μ—…μ„ λΆ„λ°°ν•˜λŠ” 병렬(Parallel) Scavenger둜 μ§„ν™”ν–ˆμŠ΅λ‹ˆλ‹€ [28, 29]. --- *Last updated: 2026-04-19* ---