--- id: P-REINFORCE-AUTO-5617F2 category: "10_Wiki/πŸ’‘ Topics/Programming & Language" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - 마크-컴팩트(Mark-Compact)" --- # [[ᄆᅑ크-ᄏα…₯ᆷᄑᅒᆨ트(Mark-Compact)|마크-컴팩트(Mark-Compact)]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > 지식 μš”μ•½ 정보 μΆ”μΆœ 쀑... ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **μž‘λ™ 원리 (λ§ˆν‚Ή 및 μ»΄νŒ©νŒ… 단계):** 마크-컴팩트 μ•Œκ³ λ¦¬μ¦˜μ€ 마크-μŠ€μœ•(Mark-Sweep)κ³Ό 맀우 λ°€μ ‘ν•˜κ²Œ κ΄€λ ¨λ˜μ–΄ 있으며, **λ§ˆν‚Ή(Marking)κ³Ό μ»΄νŒ©νŒ…(Compacting)μ΄λΌλŠ” 두 κ°€μ§€ μ£Όμš” 단계**둜 μž‘λ™ν•©λ‹ˆλ‹€ [2]. λ§ˆν‚Ή λ‹¨κ³„μ—μ„œλŠ” 루트(root)λ‘œλΆ€ν„° 도달할 수 μžˆλŠ” νž™ λ‚΄μ˜ λͺ¨λ“  라이브 객체λ₯Ό 깊이 μš°μ„  탐색(DFS) λ°©μ‹μœΌλ‘œ μΆ”μ ν•˜λ©° 발견된 객체듀을 νšŒμƒ‰(grey)μ΄λ‚˜ 흑색(black) μƒνƒœλ‘œ λ§ˆν‚Ήν•©λ‹ˆλ‹€ [3, 8-10]. λ§ˆν‚Ή μ•Œκ³ λ¦¬μ¦˜μ΄ μ’…λ£Œλ˜λ©΄ λͺ¨λ“  라이브 κ°μ²΄λŠ” ν‘μƒ‰μœΌλ‘œ, 죽은(dead) κ°μ²΄λŠ” 백색(white)으둜 λ‚¨κ²Œ 되며 이 정보가 μ»΄νŒ©νŒ… λ‹¨κ³„μ—μ„œ ν™œμš©λ©λ‹ˆλ‹€ [11]. * **μ»΄νŒ©νŒ… ν”„λ‘œμ„ΈμŠ€ (λ‹¨νŽΈν™” ν•΄μ†Œ):** μ»΄νŒ©νŒ… λ‹¨κ³„λŠ” νž™ λ©”λͺ¨λ¦¬κ°€ μ‹¬ν•˜κ²Œ λ‹¨νŽΈν™”λ˜μ–΄ μžˆμ„ λ•Œ μ‹€ν–‰λ˜λ©°, μˆ˜λ§Žμ€ μž‘μ€ 빈 곡간을 ν¬ν•¨ν•˜κ³  μžˆλŠ” **λ‹¨νŽΈν™”λœ νŽ˜μ΄μ§€μ˜ 객체듀을 λ‹€λ₯Έ νŽ˜μ΄μ§€μ˜ 빈 곡간(Free list)으둜 μ΄μ£Όμ‹œν‚΄μœΌλ‘œμ¨ μ‹€μ œ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ 쀄이렀 μ‹œλ„**ν•©λ‹ˆλ‹€ [4-6]. 각 라이브 κ°μ²΄λŠ” μƒˆλ‘œ ν• λ‹Ήλœ κ³΅κ°„μœΌλ‘œ λ³΅μ‚¬λ˜λ©°, μ›λž˜ 객체의 첫 번째 λ‹¨μ–΄μ—λŠ” μƒˆλ‘œμš΄ μœ„μΉ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” ν¬μ›Œλ”© μ£Όμ†Œ(forwarding address)κ°€ λ‚¨κ²¨μ§‘λ‹ˆλ‹€ [4]. λ§Œμ•½ κΈ°μ‘΄ νŽ˜μ΄μ§€κ°€ λͺ¨λ‘ λΉ„μ›Œμ§€λ©΄(evacuated) 운영 체제(OS)에 λ‹€μ‹œ λ°˜ν™˜λ  수 있으며, ν•„μš”μ— 따라 μƒˆλ‘œμš΄ νŽ˜μ΄μ§€κ°€ ν• λ‹Ήλ˜κΈ°λ„ ν•©λ‹ˆλ‹€ [4, 6]. * **포인터 μ—…λ°μ΄νŠΈμ™€ μ„±λŠ₯ λΉ„μš©:** 객체가 λ©”λͺ¨λ¦¬ λ‚΄μ—μ„œ 이동함에 따라, ν•΄λ‹Ή 객체듀을 가리킀고 있던 λ‹€λ₯Έ κ°μ²΄λ“€μ˜ λͺ¨λ“  μ°Έμ‘°(reference) λ˜ν•œ μƒˆλ‘œμš΄ μ£Όμ†Œλ‘œ λ³€κ²½λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€ [4, 7]. V8 μ—”μ§„μ˜ 경우, λŒ€ν”Ό(evacuation)κ°€ μ§„ν–‰λ˜λŠ” λ™μ•ˆ ν¬μΈν„°μ˜ μœ„μΉ˜λ“€μ΄ 기둝되며, λŒ€ν”Όκ°€ μ™„λ£Œλœ ν›„ 리슀트λ₯Ό μˆœνšŒν•˜λ©° **λ³΅μ‚¬λœ μƒˆλ‘œμš΄ μœ„μΉ˜λ₯Ό 가리킀도둝 포인터λ₯Ό μ—…λ°μ΄νŠΈ**ν•©λ‹ˆλ‹€ [4]. μ΄λŸ¬ν•œ λŒ€κ·œλͺ¨ 이동 및 μ°Έμ‘° μˆ˜μ • μž‘μ—…μœΌλ‘œ 인해 νž™μ„ μ»΄νŒ©νŒ…ν•˜λŠ” 과정은 **λΉ„μš©μ΄ 맀우 많이 λ“œλŠ” μ˜€νΌλ ˆμ΄μ…˜(expensive operation)**으둜 κ°„μ£Όλ©λ‹ˆλ‹€ [7]. λ§Œμ•½ νŠΉμ • νŽ˜μ΄μ§€λ₯Ό κ°€λ¦¬ν‚€λŠ” μ™ΈλΆ€ 포인터가 λ„ˆλ¬΄ λ§Žμ€ '인기 μžˆλŠ”(popular)' νŽ˜μ΄μ§€λΌλ©΄, 기둝을 μ€‘λ‹¨ν•˜κ³  λ‹€μŒ GC 사이클 λ•ŒκΉŒμ§€ λŒ€ν”Όλ₯Ό μ—°κΈ°ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€ [4]. * **트리거(Trigger) 쑰건:** 수백 λ©”κ°€λ°”μ΄νŠΈμ˜ 데이터λ₯Ό 포함할 수 μžˆλŠ” Old Spaceλ₯Ό μˆ˜μ§‘ν•˜κΈ° μœ„ν•΄ μ‹€ν–‰λ˜μ§€λ§Œ [2, 3], 항상 μˆ˜ν–‰λ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ IBM GC μ •μ±…μ˜ 경우, 기본적으둜 컴팩트 μž‘μ—…μ„ ν”Όν•˜μ§€λ§Œ `-Xcompactgc` μ»€λ§¨λ“œ 라인 μ˜΅μ…˜μ„ κ°•μ œ μ§€μ •ν–ˆμ„ λ•Œ, μŠ€μœ•(sweep) 후에도 ν• λ‹Ή μš”μ²­μ„ μΆ©μ‘±ν•  μ—¬μœ  곡간이 λΆ€μ‘±ν•  λ•Œ, λͺ…μ‹œμ  `System.gc()` 호좜 μ‹œ νŠΉμ • 쑰건을 λ§Œμ‘±ν•  λ•Œ λ“±μ˜ μƒν™©μ—μ„œ λ°œμƒν•©λ‹ˆλ‹€ [7, 12]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[α„€α…‘α„‡α…΅α„Œα…΅ ᄏα…₯ᆯ렉션(Garbage Collection)|κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(Garbage Collection)]], [[ᄆᅑ크-스윕(Mark-Sweep)|마크-μŠ€μœ•(Mark-Sweep)]], λ‹¨νŽΈν™”(Fragmentation) - **Projects/Contexts:** [[V8 JavaScript Engine|V8 JavaScript Engine]], IBM SDK/Eclipse OpenJ9 - **Contradictions/Notes:** μ†ŒμŠ€ μƒμ—μ„œ 마크-컴팩트 μ•Œκ³ λ¦¬μ¦˜μ˜ κ°œλ…μ— λŒ€ν•œ λͺ¨μˆœμ€ μ—†μŠ΅λ‹ˆλ‹€. λ‹€λ§Œ V8(μžλ°”μŠ€ν¬λ¦½νŠΈ)μ—μ„œλŠ” 주둜 'Old Space'λ₯Ό μ •λ¦¬ν•˜κΈ° μœ„ν•΄ μ„€κ³„λœ 메이저 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ˜ 핡심 λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ μ†Œκ°œλ˜λ©° [1, 2], IBM OpenJ9(μžλ°”) ν™˜κ²½μ—μ„œλŠ” κ³ λΉ„μš© μ˜€νΌλ ˆμ΄μ…˜μ΄λΌλŠ” 이유둜 κΈ°λ³Έμ μœΌλ‘œλŠ” λ°œμƒν•˜μ§€ μ•Šλ˜, 곡간 κ³ κ°ˆμ΄λ‚˜ λͺ…μ‹œμ  μ˜΅μ…˜ 적용 μ‹œ λ°œμƒν•˜λŠ” 쑰건뢀 λ™μž‘μœΌλ‘œ μžμ„Ένžˆ λ¬˜μ‚¬λ©λ‹ˆλ‹€ [7, 12]. --- *Last updated: 2026-04-19* - Raw Source: 00_Raw/2026-04-20/마크-컴팩트(Mark-Compact).md ---