--- id: wiki-2026-0508-incremental-marking title: Incremental Marking category: 10_Wiki/Topics status: needs_review canonical_id: self aliases: [] duplicate_of: none source_trust_level: A confidence_score: 0.92 tags: [auto-consolidated, technical-documentation] raw_sources: [] last_reinforced: 2026-05-08 github_commit: pending inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08) tech_stack: language: unspecified framework: unspecified --- # [[Incremental Marking|Incremental Marking]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > Incremental Marking은 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ˜ λ§ˆν‚Ή 단계λ₯Ό ν•œ 번의 κΈ΄ μΌμ‹œ μ •μ§€([[Stop-the-world|Stop-the-world]])둜 μ²˜λ¦¬ν•˜μ§€ μ•Šκ³ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰κ³Ό κ΅μ°¨ν•˜μ—¬ μ—¬λŸ¬ 개의 짧은 μž‘μ—… λ‹¨μœ„λ‘œ λ‚˜λˆ„μ–΄ μˆ˜ν–‰ν•˜λŠ” λ©”λͺ¨λ¦¬ 관리 κΈ°λ²•μž…λ‹ˆλ‹€ [1, 2]. 이 방식은 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ— μ†Œμš”λ˜λŠ” 전체 μ‹œκ°„μ„ μ€„μ΄μ§€λŠ” μ•Šμ§€λ§Œ, μž‘μ—…μ„ μ‹œκ°„μ— 따라 λΆ„μ‚°μ‹œν‚΄μœΌλ‘œμ¨ 메인 μŠ€λ ˆλ“œμ˜ 응닡성을 크게 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€ [2]. 결과적으둜 λͺ¨λ°”일 κΈ°κΈ° λ“±μ—μ„œ λ°œμƒν•  수 μžˆλŠ” κΈ΄ 지연을 λ°©μ§€ν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‚¬μš©μž μž…λ ₯ 및 μ• λ‹ˆλ©”μ΄μ…˜μ— μ›ν™œν•˜κ²Œ λ°˜μ‘ν•  수 μžˆλ„λ‘ λ•μŠ΅λ‹ˆλ‹€ [2, 3]. --- > 점진적 λ§ˆν‚Ή(Incremental marking)은 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC) κ³Όμ •μ—μ„œ λ°œμƒν•˜λŠ” κΈ΄ 쀑단 μ‹œκ°„([[Stop-the-world|Stop-the-world]])을 쀄이기 μœ„ν•΄ 전체 λ§ˆν‚Ή μž‘μ—…μ„ μ—¬λŸ¬ 개의 μž‘μ€ μΌμ‹œ μ •μ§€ κ΅¬κ°„μœΌλ‘œ λ‚˜λˆ„μ–΄ μ‹€ν–‰ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€ [1-3]. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 메인 μŠ€λ ˆλ“œ μ‹€ν–‰κ³Ό λ§ˆν‚Ή μž‘μ—…μ΄ ꡐ차둜 μ§„ν–‰λ˜λ―€λ‘œ νž™ 탐색 쀑에도 μ‚¬μš©μž μž…λ ₯ μ²˜λ¦¬λ‚˜ μ• λ‹ˆλ©”μ΄μ…˜ λ Œλ”λ§μ„ 계속할 수 μžˆμŠ΅λ‹ˆλ‹€ [2, 4]. 비둝 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ— μ†ŒλΉ„λ˜λŠ” μ΄μ‹œκ°„μ„ μ€„μ—¬μ£Όμ§€λŠ” λͺ»ν•˜μ§€λ§Œ, μž‘μ—… μ‹œκ°„μ„ λΆ„μ‚°μ‹œν‚΄μœΌλ‘œμ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ§€μ—° μ‹œκ°„(Latency)κ³Ό λ°˜μ‘μ„±μ„ 크게 κ°œμ„ ν•©λ‹ˆλ‹€ [2]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) - **트리거 및 κΈ°λ³Έ μž‘λ™ 원리:** Incremental Marking은 νž™(heap)의 크기가 νŠΉμ • μž„κ³„κ°’μ— 도달할 λ•Œ ν™œμ„±ν™”λ©λ‹ˆλ‹€ [3, 4]. ν™œμ„±ν™”λœ μ΄ν›„μ—λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•  λ•Œλ§ˆλ‹€ 짧은 λ§ˆν‚Ή 단계(step)κ°€ μ‹€ν–‰λ˜μ–΄, 객체의 생성 속도에 맞좰 λ§ˆν‚Ή ν”„λ‘œμ„ΈμŠ€κ°€ 보쑰λ₯Ό λ§žμΆ”κ²Œ λ©λ‹ˆλ‹€ [1, 4]. 일반적인 λ§ˆν‚Ήκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ 깊이 μš°μ„  탐색(Depth-First-[[Search|Search]]) 기반이며, 객체의 μƒνƒœλ₯Ό 흰색(미발견), νšŒμƒ‰(λ°œκ²¬λ˜μ—ˆμœΌλ‚˜ 이웃 객체 미처리), 검은색(μ™„μ „ 처리됨)으둜 λΆ„λ₯˜ν•˜λŠ” μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€ [3]. 이 방식을 톡해 κ³Όκ±° 500~1000ms에 λ‹¬ν•˜λ˜ κΈ΄ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ μ§€μ—° μ‹œκ°„μ΄ 5~10ms μˆ˜μ€€μ˜ 맀우 짧은 μΌμ‹œ μ •μ§€λ‘œ μͺΌκ°œμ§‘λ‹ˆλ‹€ [3, 4]. - **객체 κ·Έλž˜ν”„μ˜ 동적 λ³€ν™” 및 [[Write Barrier|Write Barrier]] λ°©μ–΄:** 점진적 λ§ˆν‚Ήμ˜ κ°€μž₯ 큰 λ‚œμ œλŠ” λ§ˆν‚Ή μž‘μ—… 사이사이에 μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ˜λ―€λ‘œ νž™ λ‚΄μ˜ 객체 κ·Έλž˜ν”„ ꡬ쑰가 계속 λ³€ν•  수 μžˆλ‹€λŠ” μ μž…λ‹ˆλ‹€ [2, 5]. 특히 μ™„μ „νžˆ 검사가 λλ‚œ '검은색' κ°μ²΄μ—μ„œ 아직 λ°œκ²¬λ˜μ§€ μ•Šμ€ '흰색' 객체둜의 μƒˆλ‘œμš΄ 포인터가 생성될 경우, μ‚΄μ•„μžˆλŠ” 흰색 객체가 κ°€λΉ„μ§€λ‘œ 잘λͺ» λΆ„λ₯˜λ  μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€ [5]. V8 엔진은 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 'μ“°κΈ° μž₯λ²½(Write Barrier)'을 μ‚¬μš©ν•˜μ—¬ κ²€μ€μƒ‰μ—μ„œ ν°μƒ‰μœΌλ‘œ ν–₯ν•˜λŠ” 포인터 생성을 κ°μ§€ν•©λ‹ˆλ‹€ [5]. μ΄λŸ¬ν•œ 포인터가 κ°μ§€λ˜λ©΄ ν•΄λ‹Ή 검은색 객체λ₯Ό λ‹€μ‹œ νšŒμƒ‰μœΌλ‘œ λ³€κ²½ν•˜κ³  λ§ˆν‚Ή 덱(deque)에 λ°€μ–΄λ„£μ–΄ μž¬κ²€μƒ‰λ˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€ [5]. - **Lazy Sweeping으둜의 μ „ν™˜:** λͺ¨λ“  객체의 생쑴 μ—¬λΆ€κ°€ μ‹λ³„λ˜μ–΄ Incremental Marking μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄, V8은 ν•œκΊΌλ²ˆμ— λ©”λͺ¨λ¦¬λ₯Ό μ§€μš°μ§€ μ•Šκ³  ν•„μš”μ— 따라 νŽ˜μ΄μ§€ λ‹¨μœ„λ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•˜λŠ” 'Lazy Sweeping' 단계λ₯Ό μ‹œμž‘ν•˜μ—¬ 남은 μ˜€λ²„ν—€λ“œλ₯Ό λΆ„μ‚°μ‹œν‚΅λ‹ˆλ‹€ [6, 7]. - **IBM JVMμ—μ„œμ˜ 적용 사둀:** μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„ 외에도 IBM JVM의 κ· ν˜•(balanced) GC μ •μ±…μ—μ„œ '점진적 λ™μ‹œ λ§ˆν‚Ή(Incremental concurrent mark [[Processing|Processing]])'이 ν™œμš©λ©λ‹ˆλ‹€ [8, 9]. μ΄λŠ” κΈ€λ‘œλ²Œ λ§ˆν‚Ή μž‘μ—…μ„ 전체 νž™μ— 걸쳐 μ μ§„μ μœΌλ‘œ μˆ˜ν–‰ν•˜λ©°, 뢀뢄적인 GC 사이클과 κ΅μ°¨λ˜μ–΄ κΈ΄ μ •μ§€ μ‹œκ°„μ„ λ°©μ§€ν•©λ‹ˆλ‹€ [8]. --- * **μž‘λ™ λ©”μ»€λ‹ˆμ¦˜ 및 ν™œμ„±ν™” 쑰건:** 점진적 λ§ˆν‚Ήμ€ νž™ 크기가 νŠΉμ • μž„κ³„κ°’μ— λ„λ‹¬ν•˜λ©΄ ν™œμ„±ν™”λ˜λ©°, 이후 μΌμ •λŸ‰μ˜ λ©”λͺ¨λ¦¬κ°€ 할당될 λ•Œλ§ˆλ‹€ 싀행이 μž μ‹œ μ€‘λ‹¨λ˜κ³  점진적 λ§ˆν‚Ή '단계(step)'κ°€ μˆ˜ν–‰λ©λ‹ˆλ‹€ [1, 3]. V8 μ—”μ§„μ—μ„œλŠ” λͺ¨λ°”일 κΈ°κΈ° κΈ°μ€€μœΌλ‘œ 각 μΌμ‹œ μ •μ§€ μ‹œκ°„μ΄ 5~10ms μˆ˜μ€€μœΌλ‘œ 맀우 짧게 μœ μ§€λ©λ‹ˆλ‹€ [1, 3]. 기본적으둜 깊이 μš°μ„  탐색(Depth-First-[[Search|Search]]) μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λ©°, 객체의 μƒνƒœλ₯Ό μ‹λ³„ν•˜κΈ° μœ„ν•΄ 흰색(미발견), νšŒμƒ‰(λ°œκ²¬λ˜μ—ˆμœΌλ‚˜ 이웃 미처리), 검은색(μ™„μ „ 처리됨)의 3색 λΆ„λ₯˜ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€ [1]. * **객체 κ·Έλž˜ν”„ λ³€κ²½κ³Ό μ“°κΈ° μž₯λ²½([[Write Barrier|Write Barrier]]s)의 μ—­ν• :** 점진적 λ§ˆν‚Ήμ˜ κ°€μž₯ 큰 νŠΉμ§•μ΄μž κ³Όμ œλŠ” λ§ˆν‚Ήμ΄ μ§„ν–‰λ˜λŠ” λ™μ•ˆ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λ˜μ–΄ νž™ λ©”λͺ¨λ¦¬μ˜ 객체 κ·Έλž˜ν”„κ°€ μ§€μ†μ μœΌλ‘œ 변경될 수 μžˆλ‹€λŠ” μ μž…λ‹ˆλ‹€ [2, 5]. λ§Œμ•½ κ°€λΉ„μ§€ 컬렉터가 이미 탐색을 마친 '검은색' κ°μ²΄μ—μ„œ 아직 νƒμƒ‰λ˜μ§€ μ•Šμ€ '흰색' 객체둜 μƒˆλ‘œμš΄ μ°Έμ‘°κ°€ μƒμ„±λœλ‹€λ©΄, μ‚΄μ•„μžˆλŠ” 흰색 객체가 κ°€λΉ„μ§€λ‘œ 잘λͺ» λΆ„λ₯˜λ  μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€ [5]. V8 엔진은 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ“°κΈ° μž₯λ²½(Write barrier)을 ν™œμš©ν•©λ‹ˆλ‹€ [5]. μ“°κΈ° μž₯벽은 검은색 κ°μ²΄μ—μ„œ 흰색 객체둜의 포인터 생성을 κ°μ§€ν•˜λ©°, ν•΄λ‹Ή 포인터가 κ°μ§€λ˜λ©΄ 검은색 객체λ₯Ό λ‹€μ‹œ νšŒμƒ‰μœΌλ‘œ λ³€κ²½ν•˜κ³  λ§ˆν‚Ή 데크(Deque)둜 되돌렀 보내 흰색 객체가 μ •μƒμ μœΌλ‘œ λ°œκ²¬λ˜λ„λ‘ μˆœμ„œλ₯Ό λ³΄μ‘΄ν•©λ‹ˆλ‹€ [5]. * **λ‹€λ₯Έ μ—”μ§„μ—μ„œμ˜ κ΅¬ν˜„ (IBM OpenJ9):** IBM의 OpenJ9 VMμ—μ„œλŠ” 'Balanced GC μ •μ±…'을 톡해 점진적 λ™μ‹œ λ§ˆν‚Ή(Incremental concurrent mark)을 μ§€μ›ν•©λ‹ˆλ‹€ [6]. 이 방식은 전역적인 STW(Stop-The-World)λ₯Ό ν”Όν•˜λ©° 전체 νž™μ— 걸쳐 λ§ˆν‚Ή μž‘μ—…μ„ μ μ§„μ μœΌλ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€ [7]. λ‹€λ₯Έ μ •μ±…μ˜ λ™μ‹œ λ§ˆν‚Ήκ³ΌλŠ” 달리 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μŠ€λ ˆλ“œκ°€ 객체 좔적에 μ°Έμ—¬ν•˜μ§€ μ•Šκ³  였직 λ°±κ·ΈλΌμš΄λ“œ μŠ€λ ˆλ“œλ§Œμ΄ 객체λ₯Ό μΆ”μ ν•˜κ³  μΉ΄λ“œ ν…Œμ΄λΈ” λ‚΄μ˜ 마크 λ§΅(Mark map)을 μ—…λ°μ΄νŠΈν•˜μ—¬ 객체 변경을 κ΄€λ¦¬ν•©λ‹ˆλ‹€ [7]. * **후속 단계 (μ§€μ—° μŠ€μœ„ν•‘):** 점진적 λ§ˆν‚Ήμ΄ μ™„λ£Œλ˜μ–΄ νž™ λ‚΄ λͺ¨λ“  객체의 생쑴 μ—¬λΆ€κ°€ κ²°μ •λ˜λ©΄, κ°€λΉ„μ§€ μ»¬λ ‰ν„°λŠ” μ§€μ—° μŠ€μœ„ν•‘(Lazy sweeping)을 μ‹œμž‘ν•©λ‹ˆλ‹€ [8, 9]. λ©”λͺ¨λ¦¬λ₯Ό μ¦‰μ‹œ ν•œ λ²ˆμ— λͺ¨λ‘ λΉ„μš°λŠ” λŒ€μ‹ , ν•„μš”ν•  λ•Œλ§ˆλ‹€ ν•„μš”ν•œ 만큼의 νŽ˜μ΄μ§€λ₯Ό μ •λ¦¬ν•¨μœΌλ‘œμ¨ GC μ£ΌκΈ°λ₯Ό μ™„λ£Œν•˜κ³  λ‹€μŒ 점진적 λ§ˆν‚Ήμ„ μ€€λΉ„ν•˜κ²Œ λ©λ‹ˆλ‹€ [8, 9]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & Updates) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. --- - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[Garbage Collection|Garbage Collection]], Write Barrier, Lazy Sweeping, Mark-Sweep, [[Orinoco|Orinoco]] - **Projects/Contexts:** [[V8 JavaScript Engine|V8 JavaScript Engine]], IBM OpenJ9 - **Contradictions/Notes:** V8 μ—”μ§„μ˜ Incremental Marking은 메인 μŠ€λ ˆλ“œκ°€ μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ 쀑간에 κ°„ν—μ μœΌλ‘œ λ§ˆν‚Ή μž‘μ—…μ„ λ‚˜λˆ„μ–΄ μˆ˜ν–‰ν•˜λŠ” κ΅¬μ‘°μ΄μ§€λ§Œ [2], IBM JVM의 Incremental concurrent mark μž‘μ—…μ—μ„œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μŠ€λ ˆλ“œκ°€ 객체 좔적에 κ΄€μ—¬ν•˜μ§€ μ•ŠμœΌλ©° 였직 λ°±κ·ΈλΌμš΄λ“œ μŠ€λ ˆλ“œλ§Œμ΄ μ‚¬μš©λœλ‹€λŠ” 기술적 차이가 μ‘΄μž¬ν•©λ‹ˆλ‹€ [8]. --- *Last updated: 2026-04-19* --- --- - **Related Topics:** κ°€λΉ„μ§€ μ»¬λ ‰μ…˜([[Garbage Collection|Garbage Collection]]), μ“°κΈ° μž₯λ²½(Write barriers), μ§€μ—° μŠ€μœ„ν•‘(Lazy sweeping) - **Projects/Contexts:** [[V8 JavaScript Engine|V8 JavaScript Engine]], [[Orinoco|Orinoco]] Garbage Collector, IBM OpenJ9 (Balanced GC) - **Contradictions/Notes:** 점진적 λ§ˆν‚Ήμ€ 메인 μŠ€λ ˆλ“œμ˜ κΈ΄ μΌμ‹œ μ •μ§€λ₯Ό λ°©μ§€ν•˜κ³  응닡성을 λ†’μ΄λŠ” λ°μ—λŠ” ν›Œλ₯­ν•œ κΈ°λ²•μ΄μ§€λ§Œ, 메인 μŠ€λ ˆλ“œμ—μ„œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ— μ†Œλͺ¨λ˜λŠ” 전체 μ‹œκ°„μ„ μ€„μ—¬μ£Όμ§€λŠ” μ•ŠμœΌλ©° 였히렀 λ―Έμ„Έν•˜κ²Œ μ¦κ°€μ‹œν‚€λŠ” κ²½ν–₯이 μžˆμŠ΅λ‹ˆλ‹€ [2]. --- *Last updated: 2026-04-19* --- ## πŸ€– LLM ν™œμš© 힌트 (How to Use This Knowledge) **μ–Έμ œ 이 지식을 μ“°λŠ”κ°€:** - *(TODO)* **μ–Έμ œ μ“°λ©΄ μ•ˆ λ˜λŠ”κ°€:** - *(TODO)* ## πŸ§ͺ 검증 μƒνƒœ (Validation) - **정보 μƒνƒœ:** needs_review - **좜처 신뒰도:** A - **κ²€ν†  이유:** *(P-Reinforce Phase 1 μžλ™ μ •κ·œν™”. λ³Έλ¬Έ 검증 ν•„μš”.)* ## 🧬 쀑볡 검사 (Duplicate Check) - **κΈ°μ‘΄ μœ μ‚¬ λ¬Έμ„œ:** *(TODO: μΈλ±μ„œ ν΄λŸ¬μŠ€ν„° 리포트 μ°Έμ‘°)* - **처리 방식:** UPDATE (μžλ™ μ •κ·œν™”) - **처리 이유:** Phase 1 μ •κ·œν™” β€” μ˜› ν…œν”Œλ¦Ώ/λˆ„λ½ ν•„λ“œ 보강. ## πŸ•“ λ³€κ²½ 이λ ₯ (Changelog) | λ‚ μ§œ | λ³€κ²½ λ‚΄μš© | 처리 방식 | 신뒰도 | |------|-----------|-----------|--------| | 2026-05-08 | P-Reinforce Phase 1 μ •κ·œν™” (frontmatter + 헀더 ν‘œμ€€ν™”) | UPDATE | A | ## πŸ’» μ½”λ“œ νŒ¨ν„΄ (Code Patterns) **νŒ¨ν„΄ 1:** *(TODO: 이 ν”„λ‘œμ νŠΈ μ»¨λ²€μ…˜ λ°˜μ˜ν•œ ꡬ쑰 μŠ€μΌˆλ ˆν†€)* ```text # TODO ``` ## πŸ€” μ˜μ‚¬κ²°μ • κΈ°μ€€ (Decision Criteria) **선택 Aλ₯Ό 써야 ν•  λ•Œ:** - *(TODO)* **선택 Bλ₯Ό 써야 ν•  λ•Œ:** - *(TODO)* **κΈ°λ³Έκ°’:** > *(TODO)* ## ❌ μ•ˆν‹°νŒ¨ν„΄ (Anti-Patterns) - **[μ•ˆν‹°νŒ¨ν„΄]:** *(TODO: 무엇을 ν•˜λ©΄ μ•ˆ λ˜λŠ”κ°€ + 이유 + λŒ€μ‹  무엇을)*