--- category: Unified tags: [auto-consolidated, technical-documentation] title: [[Mark-Sweep|Mark-Sweep]] last_updated: 2026-05-02 --- # [[Mark-Sweep|Mark-Sweep]] ## πŸ“Œ Brief Summary > Mark-Sweep(마크-μŠ€μœ„ν”„)λŠ” V8 μ—”μ§„κ³Ό JVM λ“±μ—μ„œ 였래된 객체([[Old Space|Old Space]]/Generation)의 λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•˜κΈ° μœ„ν•΄ 주둜 μ‚¬μš©λ˜λŠ” κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC) μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€ [1-4]. 이 μ•Œκ³ λ¦¬μ¦˜μ€ νž™ λ©”λͺ¨λ¦¬ λ‚΄μ˜ λͺ¨λ“  ν™œμ„± 객체λ₯Ό μ‹λ³„ν•˜μ—¬ ν‘œμ‹œν•˜λŠ” 'λ§ˆν‚Ή(Marking)' 단계와, ν‘œμ‹œλ˜μ§€ μ•Šμ€ 죽은 객체의 λ©”λͺ¨λ¦¬ μ˜μ—­μ„ ν•΄μ œν•˜λŠ” 'μŠ€μœ„ν•‘(Sweeping)' λ‹¨κ³„λ‘œ λ™μž‘ν•©λ‹ˆλ‹€ [2, 5]. κΈ°μ‘΄μ—λŠ” κΈ΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μΌμ‹œ μ •μ§€([[Stop-the-world|Stop-the-world]])λ₯Ό μœ λ°œν–ˆμœΌλ‚˜, ν˜„λŒ€μ˜ 엔진듀은 점진적(Incremental), μ§€μ—°(Lazy), 그리고 병행(Concurrent) 처리 기법을 κ²°ν•©ν•˜μ—¬ μ„±λŠ₯ μ˜€λ²„ν—€λ“œλ₯Ό 크게 μ€„μ˜€μŠ΅λ‹ˆλ‹€ [6-9]. --- > 마크-μŠ€μœ•(Mark-Sweep)은 V8 μ—”μ§„ 및 μžλ°” 가상 λ¨Έμ‹ (JVM) λ“±μ—μ„œ 더 이상 ν•„μš”ν•˜μ§€ μ•Šμ€ 객체의 λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ£Όμš” κ°€λΉ„μ§€ μ»¬λ ‰μ…˜([[Major GC|Major GC]]) μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€ [1-3]. 이 μ•Œκ³ λ¦¬μ¦˜μ€ νž™μ„ μˆœνšŒν•˜λ©° ν™œμ„± μƒνƒœμΈ 객체λ₯Ό μ‹λ³„ν•˜λŠ” '마크(Mark)' 단계와, ν‘œμ‹œλ˜μ§€ μ•Šμ€ 객체λ₯Ό μ œκ±°ν•˜μ—¬ λ©”λͺ¨λ¦¬λ₯Ό ν™•λ³΄ν•˜λŠ” 'μŠ€μœ•(Sweep)' λ‹¨κ³„λ‘œ λ‚˜λ‰˜μ–΄ λ™μž‘ν•©λ‹ˆλ‹€ [2, 4, 5]. 주둜 μˆ˜μ‹­μ—μ„œ 수백 λ©”κ°€λ°”μ΄νŠΈμ˜ 데이터λ₯Ό 포함할 수 μžˆλŠ” λŒ€μš©λŸ‰ λ©”λͺ¨λ¦¬ μ˜μ—­μΈ ꡬ곡간([[Old Space|Old Space]])을 κ΄€λ¦¬ν•˜λŠ” 데 ν•„μˆ˜μ μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€ [4, 6]. ## πŸ“– Core Content * **λ§ˆν‚Ή(Marking) 단계** * λ§ˆν‚Ή μ•Œκ³ λ¦¬μ¦˜μ€ 본질적으둜 ν¬μΈν„°λ‘œ μ—°κ²°λœ 객체 κ·Έλž˜ν”„λ₯Ό 루트(Roots)μ—μ„œλΆ€ν„° μΆ”μ ν•˜λŠ” 깊이 μš°μ„  탐색(Depth-First-[[Search|Search]])μž…λ‹ˆλ‹€ [4, 10, 11]. * V8 μ—”μ§„μ—μ„œλŠ” 각 νŽ˜μ΄μ§€μ— ν• λ‹Ή κ°€λŠ₯ν•œ 단어(word)λ‹Ή ν•˜λ‚˜μ˜ λΉ„νŠΈλ₯Ό κ°–λŠ” λ§ˆν‚Ή λΉ„νŠΈλ§΅(Marking bitmap)을 μœ μ§€ν•˜λ©°, 객체의 λ§ˆν‚Ή μƒνƒœλ₯Ό μ„Έ κ°€μ§€ 색상(흰색, νšŒμƒ‰, 검은색)으둜 λΆ„λ₯˜ν•©λ‹ˆλ‹€ [4, 12]. * 흰색(White)은 아직 GCκ°€ λ°œκ²¬ν•˜μ§€ λͺ»ν•œ μƒνƒœ, νšŒμƒ‰(Grey)은 λ°œκ²¬λ˜μ—ˆμœΌλ‚˜ 이웃 객체듀이 λͺ¨λ‘ μ²˜λ¦¬λ˜μ§€ μ•Šμ€ μƒνƒœ, 검은색(Black)은 λ°œκ²¬λ˜μ—ˆκ³  λͺ¨λ“  이웃 κ°μ²΄κΉŒμ§€ μ²˜λ¦¬κ°€ μ™„λ£Œλœ ν™œμ„± μƒνƒœλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€ [12, 13]. * λ§ˆν‚Ή κ³Όμ • 쀑 객체듀은 'λ§ˆν‚Ή 데크(Marking deque)'λΌλŠ” 버퍼에 μ €μž₯되며, 큐가 λΉ„μ›Œμ§€κ³  λͺ¨λ“  발견된 객체가 κ²€μ€μƒ‰μœΌλ‘œ ν‘œμ‹œλ  λ•ŒκΉŒμ§€ 탐색이 λ°˜λ³΅λ©λ‹ˆλ‹€ [10, 13]. * **μŠ€μœ„ν•‘(Sweeping) 단계** * λ§ˆν‚Ήμ΄ μ™„λ£Œλœ ν›„, μŠ€μœ„ν•‘ μ•Œκ³ λ¦¬μ¦˜μ€ νž™μ„ μŠ€μΊ”ν•˜μ—¬ ν°μƒ‰μœΌλ‘œ 남은 죽은 κ°μ²΄λ“€μ˜ μ—°μ†λœ λ²”μœ„λ₯Ό μ°Ύμ•„λƒ…λ‹ˆλ‹€ [4, 14, 15]. * ν™•μΈλœ 죽은 객체의 λ©”λͺ¨λ¦¬ 곡간을 μ—¬μœ  곡간(Free space)으둜 λ³€ν™˜ν•˜κ³  이λ₯Ό '자유 λͺ©λ‘(Free list)'에 μΆ”κ°€ν•˜μ—¬ μƒˆλ‘œμš΄ 객체 ν• λ‹Ή μ‹œ μž¬μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€ [14-16]. * V8μ—μ„œλŠ” νŽ˜μ΄μ§€ μˆ˜μ€€μ—μ„œ μž‘λ™ν•˜λ©°, 객체의 크기(μ†Œν˜•, μ€‘ν˜•, λŒ€ν˜• λ“±)에 따라 λ³„λ„μ˜ 자유 λͺ©λ‘μ„ μœ μ§€ κ΄€λ¦¬ν•©λ‹ˆλ‹€ [14, 16]. * **μ΅œμ ν™” 및 λ°œμ „ ([[Optimization|Optimization]])** * 전체 νž™μ„ λŒ€μƒμœΌλ‘œ ν•˜λŠ” 마크-μŠ€μœ„ν”„λŠ” μ‹œκ°„μ΄ 였래 κ±Έλ € 500-1000ms μˆ˜μ€€μ˜ 'Stop-the-world' μΌμ‹œ μ •μ§€λ₯Ό μœ λ°œν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€ [6]. * 이λ₯Ό μ™„ν™”ν•˜κΈ° μœ„ν•΄ V8은 νž™ λ§ˆν‚Ήμ„ 5-10ms λ‹¨μœ„μ˜ μž‘μ€ μž‘μ—…μœΌλ‘œ λ‚˜λˆ„μ–΄ μ‹€ν–‰ν•˜λŠ” **점진적 λ§ˆν‚Ή([[Incremental Marking|Incremental Marking]])**κ³Ό λ©”λͺ¨λ¦¬ ν•΄μ œλ₯Ό μ¦‰μ‹œ μ „λΆ€ μˆ˜ν–‰ν•˜μ§€ μ•Šκ³  ν•„μš”μ— 따라 λ―Έλ£¨λŠ” **μ§€μ—° μŠ€μœ„ν•‘(Lazy sweeping)**을 λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€ [6, 7, 17, 18]. * 졜근의 [[Orinoco|Orinoco]] κ°€λΉ„μ§€ 컬렉터 및 JVM μ •μ±…μ—μ„œλŠ” 메인 μŠ€λ ˆλ“œ 싀행에 영ν–₯을 μ£Όμ§€ μ•ŠκΈ° μœ„ν•΄ λ°±κ·ΈλΌμš΄λ“œ μŠ€λ ˆλ“œμ—μ„œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” **병행(Concurrent) λ§ˆν‚Ή 및 μŠ€μœ„ν•‘** κΈ°μˆ μ„ ν™œμš©ν•˜μ—¬ λŒ€κΈ° μ‹œκ°„μ„ 획기적으둜 μ΅œμ†Œν™”ν–ˆμŠ΅λ‹ˆλ‹€ [8, 9, 19]. --- **μ•Œκ³ λ¦¬μ¦˜μ˜ μ£Όμš” λ™μž‘ 단계** * **마크(Mark) 단계:** κ°€λΉ„μ§€ 컬렉터가 μŠ€νƒ 포인터와 같은 GC 루트(Root)μ—μ„œ μ‹œμž‘ν•˜μ—¬ ν¬μΈν„°λ‘œ μ—°κ²°λœ 객체 κ·Έλž˜ν”„λ₯Ό 깊이 μš°μ„  탐색(DFS) λ°©μ‹μœΌλ‘œ μž¬κ·€μ μœΌλ‘œ μˆœνšŒν•©λ‹ˆλ‹€ [6, 7]. 이 과정을 톡해 도달 κ°€λŠ₯ν•œ(Reachable) 객체, 즉 ν˜„μž¬ μ‚¬μš© 쀑인 κ°μ²΄λŠ” ν™œμ„± μƒνƒœλ‘œ μ‹λ³„λ˜μ–΄ λ§ˆν¬λ©λ‹ˆλ‹€ [2, 5, 6, 8]. V8의 마크 λ‹¨κ³„λŠ” 객체의 μƒνƒœλ₯Ό 미발견 μƒνƒœμΈ '백색(White)', λ°œκ²¬λ˜μ—ˆμœΌλ‚˜ 이웃 객체가 아직 μ²˜λ¦¬λ˜μ§€ μ•Šμ€ 'νšŒμƒ‰(Grey)', 그리고 μ΄μ›ƒκΉŒμ§€ μ™„μ „νžˆ 처리된 '흑색(Black)'으둜 λΆ„λ₯˜ν•˜λŠ” 삼색(Tri-color) λ§ˆν‚Ή μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€ [6, 9]. * **μŠ€μœ•(Sweep) 단계:** 마크 단계가 μ™„λ£Œλœ ν›„, κ°€λΉ„μ§€ μ»¬λ ‰ν„°λŠ” νž™μ˜ λ§ˆν‚Ή λΉ„νŠΈλ§΅μ„ μŠ€μΊ”ν•˜μ—¬ ν™œμ„± μƒνƒœλ‘œ 흑색 ν‘œμ‹œκ°€ λ˜μ§€ μ•Šμ€(즉, λ°±μƒ‰μœΌλ‘œ 남은) κ°μ²΄λ“€μ˜ μ—°μ†λœ λ²”μœ„λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€ [5, 6, 10, 11]. μ΄λ ‡κ²Œ 발견된 μ‚¬μš© λΆˆκ°€λŠ₯ν•œ κ°μ²΄λ“€μ˜ λ©”λͺ¨λ¦¬ μ£Όμ†ŒλŠ” μ—¬μœ  곡간(Free space)으둜 λ³€ν™˜λ˜μ–΄ 빈 λͺ©λ‘(Free list)에 μΆ”κ°€λ˜λ©°, 이후 μƒˆλ‘œμš΄ 객체λ₯Ό ν• λ‹Ήν•  λ•Œ μž¬μ‚¬μš©λ©λ‹ˆλ‹€ [6, 10, 11]. **V8 μ—”μ§„μ—μ„œμ˜ ν™œμš© 및 μ„±λŠ₯ μ΅œμ ν™”** * **ꡬ곡간(Old Space) 관리:** 신곡간(New Space)을 κ΄€λ¦¬ν•˜λŠ” μŠ€μΊλΉˆμ§€([[Scavenge|Scavenge]]) μ•Œκ³ λ¦¬μ¦˜μ€ μ†Œκ·œλͺ¨ λ©”λͺ¨λ¦¬ μˆ˜μ§‘μ—λŠ” λΉ λ₯΄μ§€λ§Œ 전체 λ©”λͺ¨λ¦¬μ˜ 두 λ°° 곡간을 ν•„μš”λ‘œ ν•˜λŠ” μ˜€λ²„ν—€λ“œκ°€ μžˆμ–΄ λŒ€μš©λŸ‰ νž™μ—λŠ” λΆ€μ ν•©ν•©λ‹ˆλ‹€ [4, 6]. λ”°λΌμ„œ V8은 수λͺ…이 κΈ΄ 객체듀이 λͺ¨μ—¬ μžˆλŠ” ꡬ곡간을 μˆ˜μ§‘ν•  λ•Œ 마크-μŠ€μœ• λ˜λŠ” 객체λ₯Ό ν•œκ³³μœΌλ‘œ λͺ¨μœΌλŠ” 과정이 μΆ”κ°€λœ 마크-컴팩트(Mark-Compact) μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€ [4, 6, 12]. * **λ™μ‹œμ„± 및 점진적 처리 기법:** 전톡적인 마크-μŠ€μœ• 방식은 μ‹€ν–‰ 쀑인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 메인 μŠ€λ ˆλ“œλ₯Ό μž₯μ‹œκ°„ λ©ˆμΆ”κ²Œ ν•˜λŠ”([[Stop-the-world|Stop-the-world]]) λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€ [13, 14]. V8은 μ΄λŸ¬ν•œ μ§€μ—° ν˜„μƒμ„ 쀄이기 μœ„ν•΄ λ§ˆν‚Ή μž‘μ—…μ„ μ—¬λŸ¬ 번의 짧은 멈좀으둜 λ‚˜λˆ„μ–΄ μˆ˜ν–‰ν•˜λŠ” 점진적 λ§ˆν‚Ή([[Incremental Marking|Incremental Marking]]), λ°±κ·ΈλΌμš΄λ“œ 헬퍼 μŠ€λ ˆλ“œλ₯Ό ν™œμš©ν•˜μ—¬ 메인 μŠ€λ ˆλ“œμ— 영ν–₯을 μ£Όμ§€ μ•ŠλŠ” λ™μ‹œμ (Concurrent) λ§ˆν‚Ή 및 μŠ€μœ•, 그리고 ν•„μš”ν•  λ•ŒκΉŒμ§€ λ©”λͺ¨λ¦¬ ν•΄μ œλ₯Ό λ―Έλ£¨λŠ” μ§€μ—° μŠ€μœ•(Lazy sweeping) 기법을 λ„μž…ν•΄ μ„±λŠ₯을 μ΅œμ ν™”ν–ˆμŠ΅λ‹ˆλ‹€ [13-16]. ## βš–οΈ Trade-offs & Caveats - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. --- - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— Knowledge Connections - **Related Topics:** [[Garbage Collection|Garbage Collection]], Old Generation, Mark-Compact, [[Incremental Marking|Incremental Marking]], Lazy Sweeping - **Projects/Contexts:** [[V8 JavaScript Engine|V8 JavaScript Engine]], JVM (Java Virtual Machine), Orinoco Garbage Collector - **Contradictions/Notes:** 마크-μŠ€μœ„ν”„λŠ” λΉ λ₯΄κ³  곡간을 효과적으둜 μž¬ν™œμš©ν•˜μ§€λ§Œ, λ©”λͺ¨λ¦¬ νŒŒνŽΈν™”(Fragmentation)λ₯Ό μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ V8μ—μ„œλŠ” νŒŒνŽΈν™”κ°€ μ‹¬ν•œ νŽ˜μ΄μ§€μ˜ 라이브 객체λ₯Ό μ΄λ™μ‹œν‚€κ³  빈 곡간을 λ³‘ν•©ν•˜λŠ” Mark-Compact μ•Œκ³ λ¦¬μ¦˜κ³Ό λ°€μ ‘ν•˜κ²Œ μ—°κ³„λ˜μ–΄ μ‚¬μš©λ©λ‹ˆλ‹€ [2, 4, 5, 20]. λ˜ν•œ, Node.js ν™˜κ²½μ—μ„œ `--trace_gc` 둜그 상에 'Mark-sweep'이 μ§€λ‚˜μΉ˜κ²Œ 자주 λ°œμƒν•˜κ±°λ‚˜ λ°˜ν™˜λ˜λŠ” λ©”λͺ¨λ¦¬κ°€ λ―Έλ―Έν•˜λ‹€λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜([[memory|memory]] Leak)λ‚˜ CPU 집약적 λΈ”λ‘œν‚Ή μž‘μ—…μ΄ μ‘΄μž¬ν•  κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€ [21, 22]. --- *Last updated: 2026-04-19* --- --- - **Related Topics:** κ°€λΉ„μ§€ μ»¬λ ‰μ…˜([[Garbage Collection|Garbage Collection]]), ꡬ곡간(Old Space), 마크-컴팩트(Mark-Compact), [[α„Œα…₯α†·α„Œα…΅α†«α„Œα…₯ᆨ ᄆᅑ캉(Incremental marking)|점진적 λ§ˆν‚Ή(Incremental Marking]], μŠ€μΊλΉˆμ§€(Scavenge) - **Projects/Contexts:** V8 μ—”μ§„([[V8 Engine|V8 Engine]]), μ˜€λ¦¬λ…Έμ½”(Orinoco), [[α„Œα…‘α„‡α…‘ ᄀᅑᄉᅑᆼ ᄆα…₯산(JVM)|μžλ°” 가상 λ¨Έμ‹ (JVM]] - **Contradictions/Notes:** μ†ŒμŠ€μ˜ μ„€λͺ…에 λ”°λ₯΄λ©΄, μŠ€μΊλΉˆμ§€(Scavenge) μ•Œκ³ λ¦¬μ¦˜μ€ 투-슀페이슀(to-space)와 프둬-슀페이슀(from-space)λ₯Ό μ‚¬μš©ν•˜λŠ” 물리적 λ©”λͺ¨λ¦¬ μ˜€λ²„ν—€λ“œκ°€ 크기 λ•Œλ¬Έμ— 신곡간(New Space)μ—μ„œλ§Œ μœ μš©ν•˜κ²Œ 쓰이며, 반면 마크-μŠ€μœ•μ€ λ©”λͺ¨λ¦¬ μ˜€λ²„ν—€λ“œλŠ” μ μ§€λ§Œ μ‹€ν–‰ μ‹œκ°„μ΄ 였래 걸릴 수 μžˆμ–΄ ꡬ곡간(Old Space) 관리에 μ‚¬μš©λœλ‹€λŠ” λͺ…ν™•ν•œ μ—­ν•  뢄담이 μ‘΄μž¬ν•©λ‹ˆλ‹€ [4, 6]. --- *Last updated: 2026-04-19* ---