--- category: Unified tags: [auto-consolidated, technical-documentation] title: [[Incremental Marking|Incremental Marking]] last_updated: 2026-05-02 --- # [[Incremental Marking|Incremental Marking]] ## πŸ“Œ Brief 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]. ## πŸ“– Core 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]. ## βš–οΈ Trade-offs & Caveats - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. --- - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— Knowledge Connections - **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* ---