Files
2nd/10_Wiki/Topics/Architecture/Orinoco.md
T

15 KiB

category, tags, title, last_updated
category tags title last_updated
Unified
auto-consolidated
technical-documentation
Orinoco 가비지 컬렉터|Orinoco 가비지 컬렉터
2026-05-02

Orinoco 가비지 컬렉터

📌 Brief Summary

Orinoco는 V8 JavaScript 엔진의 가비지 컬렉션(GC) 성능을 최적화하기 위해 도입된 프로젝트의 코드명입니다 [1, 2]. 기존의 순차적이고 프로그램 실행을 멈추게 하는 'Stop-the-world' 방식의 수집기를 점진적(Incremental) 폴백(Fallback)을 갖춘 병렬(Parallel) 및 동시성(Concurrent) 수집기로 탈바꿈시켰습니다 [1, 3]. 이를 통해 메인 스레드의 GC 작업 부담을 최소화하여 애플리케이션의 지연 시간(Latency)을 줄이고 스크롤 및 애니메이션 렌더링을 훨씬 부드럽게 만들었습니다 [4, 5].


Orinoco 프로젝트는 V8 JavaScript 엔진의 가비지 컬렉터(GC)를 최신 기술로 개선하기 위해 진행된 프로젝트의 코드명입니다 [1-3]. 이 프로젝트는 기존의 순차적이고 모든 실행을 멈추는 'Stop-the-world' 방식의 가비지 컬렉터를 병렬(parallel), 동시(concurrent), 점진적(incremental) 기술을 활용하는 형태로 진화시켰습니다 [1, 2, 4]. 주된 목적은 메인 스레드의 부하를 덜어주어 가비지 컬렉션으로 인한 프로그램 중지 시간(pause time)을 최소화하고 사용자 경험을 향상시키는 것입니다 [2, 5].


Orinoco는 V8 JavaScript 엔진의 가비지 컬렉터(GC) 성능을 최적화하기 위해 진행된 프로젝트의 코드명입니다 [1, 2]. 이 프로젝트는 기존의 순차적이고 애플리케이션 실행을 완전히 멈추는(Stop-the-world) 방식의 가비지 컬렉터를 병렬(parallel), 동시(concurrent), 점진적(incremental) 기법을 활용하는 형태로 변환했습니다 [1, 2]. 결과적으로 메인 스레드의 부담을 해방시켜 지연(latency) 및 멈춤(jank) 현상을 줄이고, 애니메이션과 사용자 상호작용을 훨씬 부드럽게 만들어 줍니다 [3-6].


오리노코(Orinoco) 프로젝트는 구글의 V8 자바스크립트 엔진에 탑재된 최신 가비지 컬렉터(GC)를 개선하기 위한 프로젝트의 코드명입니다 [1, 2]. 기존의 순차적이고 메인 스레드를 완전히 멈추게 하는 "Stop-the-world" 방식의 한계를 극복하기 위해 시작되었습니다 [2, 3]. 이를 위해 병렬(parallel), 점진적(incremental), 동시(concurrent) 처리 기법을 도입하여 메인 스레드의 부담을 해방시키고 애플리케이션의 일시 정지 시간(Pause time)을 최소화하는 것을 목표로 합니다 [4, 5].

📖 Core Content

핵심 가비지 컬렉션 기술 Orinoco는 메인 스레드를 해방시키기 위해 다음 세 가지 주요 최적화 기법을 혼합하여 사용합니다 [2].

  • 병렬(Parallel) 처리: 메인 스레드와 헬퍼 스레드가 동시에 대략 같은 양의 GC 작업을 수행합니다 [2]. 애플리케이션 실행을 멈추는 'stop-the-world' 접근법이긴 하지만, 총 중단 시간을 참여하는 스레드 수만큼 나누어 대기 시간을 단축시킵니다 [2].
  • 점진적(Incremental) 처리: 전체 GC를 한 번에 하는 대신, 메인 스레드가 간헐적으로 소량의 GC 작업만 수행합니다 [6]. JavaScript 실행과 GC 작업이 번갈아 발생하도록 분산시켜 애플리케이션이 사용자 입력과 애니메이션 처리에 지속적으로 응답할 수 있게 합니다 [6, 7].
  • 동시성(Concurrent) 처리: 메인 스레드가 JavaScript를 계속 실행하는 동안, 헬퍼 스레드들이 백그라운드에서 GC 작업을 전적으로 수행합니다 [8]. 이는 메인 스레드를 자유롭게 하지만, 객체의 변경 사항을 관리하기 위해 스레드 간 동기화와 읽기/쓰기 충돌을 제어해야 하는 가장 고난도의 기술입니다 [8].

주요 GC 단계별 Orinoco의 적용

  • Minor GC (Scavenger): V8의 Young 세대 가비지 컬렉터는 병렬 스캐빈징(Parallel scavenging)을 사용하여 여러 헬퍼 스레드에 작업을 분산시킵니다 [9, 10]. 각 헬퍼 스레드는 포인터를 따라가며 살아있는 객체를 새로운 메모리 공간(To-Space)으로 대피시키고 포인터를 병렬로 업데이트합니다 [9].
  • Major GC (Mark-Compact): Old 세대의 수집은 주로 동시 마킹(Concurrent marking)으로 시작됩니다 [11]. 백그라운드의 헬퍼 스레드들이 살아있는 객체를 찾아 마킹하는 동안 메인 스레드는 JavaScript를 실행하며, 새로 생성된 참조는 '쓰기 장벽(Write Barriers)'을 통해 추적됩니다 [11, 12]. 이후 메인 스레드는 잠시 멈춰 빠른 마킹 완료 처리를 한 뒤, 헬퍼 스레드들과 함께 병렬 압축(Parallel compaction)을 수행하고 백그라운드에서는 동시 스윕(Concurrent sweeping)을 진행합니다 [13, 14].

기타 최적화 기법

  • Idle-time GC (유휴 시간 GC): Chrome과 같은 환경에서 애니메이션 프레임(예: 초당 60프레임, 약 16.6ms)을 렌더링한 후 여유 시간이 남을 경우, GC가 해당 유휴 시간을 활용하여 선제적으로 가비지 컬렉션 작업을 수행합니다 [5, 15].
  • 기타 V8의 블랙 할당(Black allocation) 기능과 포인터 추적(Tracking Pointers) 기법을 개선하여 On-heap 및 Off-heap 메모리의 피크 사용량을 큰 폭으로 줄였습니다 [3, 16, 17].

  • GC 모델의 현대화: Orinoco는 기존의 'stop-the-world' 중지 방식을 벗어나, 동시적이고 병렬적이며 점진적인 GC 모델로의 전환을 의미합니다 [1, 4]. 이를 위해 스마트 페이징과 동시성 친화적 알고리즘을 도입하여 '구 세대(Old Generation)'와 '신 세대(Young Generation)' 가비지 컬렉터를 병렬화했습니다 [5].
  • 병렬(Parallel) 기법 도입: 메인 스레드와 다수의 헬퍼 스레드가 동시에 거의 동일한 양의 작업을 수행하도록 처리합니다 [2]. 이 역시 실행을 일시 중지하는 방식이지만, 동기화에 필요한 약간의 오버헤드를 제외하면 전체 중지 시간을 참여하는 스레드의 수만큼 나누어 크게 줄일 수 있습니다 [2].
  • 점진적(Incremental) 마킹: 마킹 작업을 아주 작은 덩어리로 나누어 JavaScript 실행 중간중간에 교차로 배치(interleave)하는 방식입니다 [6, 7]. 이 방식은 총 GC 시간을 줄이지는 못하지만 긴 중지 시간을 잘게 분산시킴으로써, 애플리케이션이 끊김 없이 사용자 입력이나 애니메이션에 반응할 수 있도록 돕습니다 [6, 7].
  • 동시(Concurrent) 처리: 메인 스레드가 멈추지 않고 JavaScript를 실행하는 동안, 백그라운드의 헬퍼 스레드들이 GC 작업을 전담하여 처리합니다 [8]. 객체의 상태가 언제든 변할 수 있어 읽기/쓰기 경합(read/write races)을 처리해야 하는 가장 복잡한 기술이지만, 메인 스레드를 온전히 자유롭게 해방시킬 수 있습니다 [8].
  • 프로젝트의 성과 및 확장: Orinoco 프로젝트를 통해 많은 GC 작업이 백그라운드로 이동하면서 지연 시간과 페이지 로딩 성능이 비약적으로 향상되었으며, 스크롤이나 애니메이션이 훨씬 부드러워졌습니다 [9]. 더 나아가, 여기서 개발된 새로운 기술의 일부는 Chrome의 렌더러(Blink)에 내장된 가비지 컬렉터인 'Oilpan'으로 이식하여 협력을 개선하는 작업도 진행 중입니다 [10].

  • 병렬(Parallel) 처리: 메인 스레드와 여러 헬퍼 스레드들이 동시에 동일한 가비지 컬렉션 작업을 나누어 수행하는 기법입니다 [5]. 애플리케이션 실행이 일시 정지되는 'stop-the-world' 접근법이기는 하지만, 다수의 스레드가 작업을 분담하므로 총 정지 시간이 스레드 수에 비례해 크게 단축됩니다 [5]. Orinoco의 병렬 스캐빈저(Parallel Scavenger)는 이 방식을 사용하여 Young Generation의 GC 작업 시간을 워크로드에 따라 20%~50%가량 감소시켰습니다 [6-8].
  • 점진적(Incremental) 처리: 메인 스레드가 한 번에 전체 GC를 수행하는 대신, 소량의 GC 작업만 간헐적으로 수행하도록 쪼개는 방식입니다 [9]. 이를 통해 가비지 컬렉션 중간에 JavaScript 실행이 틈틈이 이루어지므로 프로그램이 멈추지 않고 사용자 입력이나 애니메이션에 계속 반응할 수 있습니다 [9].
  • 동시(Concurrent) 처리: 메인 스레드가 JavaScript를 멈춤 없이 계속 실행하는 동안, 헬퍼 스레드들이 백그라운드에서 완전히 GC 작업을 전담하여 수행합니다 [10, 11]. 힙의 상태가 언제든 변할 수 있어 읽기/쓰기 경합(race)을 관리해야 하므로 구현이 가장 까다롭지만, 메인 스레드가 자유로워진다는 큰 장점이 있습니다 [10]. Orinoco는 동시 마킹 및 스위핑을 도입하여 무거운 WebGL 게임 등에서 일시 정지 시간을 최대 50%까지 줄였습니다 [6, 12].
  • 메모리 및 효율성 최적화: Orinoco 프로젝트는 세대 간(generational) 엄격한 경계 없이 통합된 힙에서 작동하며, 스마트 페이징 기법과 블랙 할당(Black Allocation) 최적화 등을 통해 저사양 메모리 기기에서 온힙(on-heap) 최고 메모리 소비량을 최대 40%, 오프힙(off-heap) 소비량을 20%까지 줄이는 성과를 내었습니다 [13].

  • 오리노코의 주요 목표: 전통적인 가비지 컬렉터는 메인 스레드의 자바스크립트 실행을 완전히 멈추고 작업을 수행해야 하므로 화면 끊김(Jank)과 지연(Latency) 문제를 유발하여 프로그램 처리량을 감소시켰습니다 [6]. 오리노코는 가비지 컬렉션 작업을 백그라운드 태스크로 분산시키고 메인 스레드를 해방시켜, 사용자 상호작용과 애니메이션 렌더링을 훨씬 부드럽게 만드는 데 집중했습니다 [4, 7].
  • 3가지 핵심 GC 고도화 기법:
    • 병렬 처리(Parallel): 메인 스레드와 여러 헬퍼 스레드가 동시에 가비지 컬렉션 작업을 나누어 수행합니다 [8]. 자바스크립트 실행이 멈추는 "stop-the-world" 접근 방식이긴 하지만, 전체 정지 시간을 참여하는 스레드의 수만큼 나누어 대폭 단축시킵니다 [8]. V8은 젊은 세대(Young Generation)를 처리하는 Scavenger GC에 병렬 스캐빈징을 도입하였습니다 [9].
    • 점진적 처리(Incremental): 메인 스레드가 한 번에 전체 가비지 컬렉션을 수행하지 않고, 자바스크립트를 실행하는 중간중간 간헐적으로 아주 작은 조각 단위의 GC 작업을 수행합니다 [10].
    • 동시 처리(Concurrent): 메인 스레드가 자바스크립트를 끊임없이 실행하는 동안, 헬퍼 스레드들이 완전히 백그라운드에서 GC 작업을 처리하는 가장 고도화된 방식입니다 [11]. 메이저 GC(Major GC)의 마킹(Marking)과 스위핑(Sweeping) 단계에 동시 처리 기법이 사용됩니다 [12, 13].
  • 도입 효과 및 성과: 오리노코 프로젝트를 통해 메인 스레드에서 수행되던 가비지 컬렉션 작업이 약 56% 감소했습니다 [3]. 병렬 Scavenger는 워크로드에 따라 메인 스레드의 젊은 세대 GC 시간을 20%~50% 줄였으며, 동시 마킹 및 스위핑 기술은 무거운 WebGL 게임 등에서 일시 정지 시간을 최대 50%까지 감소시켰습니다 [7].

⚖️ Trade-offs & Caveats

  • 과거 데이터와의 충돌: 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
  • 정책 변화: Programming & Language 분야의 자동 자산화 수행.

  • 과거 데이터와의 충돌: 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
  • 정책 변화: Programming & Language 분야의 자동 자산화 수행.

  • 과거 데이터와의 충돌: 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
  • 정책 변화: Programming & Language 분야의 자동 자산화 수행.

  • 과거 데이터와의 충돌: 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
  • 정책 변화: Programming & Language 분야의 자동 자산화 수행.

🔗 Knowledge Connections

  • Related Topics: 가비지 컬렉션(Garbage Collection), V8 JavaScript 엔진, Minor GC (Scavenger), Major GC (Mark-Compact), 세대별 가비지 컬렉션(Generational Garbage Collection)
  • Projects/Contexts: V8 메모리 관리 및 최적화, Node.js 및 Chrome 브라우저 렌더링 성능 최적화
  • Contradictions/Notes: 과거 V8 버전은 Cheney의 동기식 세미스페이스 복사 알고리즘을 사용했으나, V8 v6.2부터 Orinoco 프로젝트의 일환으로 동적 작업 훔치기(Work stealing) 기법을 사용하는 Halstead 방식의 병렬 스캐빈저로 대체되었습니다 [10, 18].

Last updated: 2026-04-19



  • Related Topics: V8 Engine, Garbage Collection (GC), Stop-the-world, Incremental Marking
  • Projects/Contexts: Oilpan, Blink
  • Contradictions/Notes: 소스에 관련 정보가 부족합니다. (소스 내에서 Orinoco 프로젝트에 대한 상충되는 주장은 발견되지 않습니다.)

Last updated: 2026-04-19



  • Related Topics: V8 Engine, Garbage Collection, Scavenger, Mark-Compact
  • Projects/Contexts: JavaScript memory Management
  • Contradictions/Notes: 소스 간 Orinoco의 목적과 기술적 효과에 대해 상충되는 정보는 발견되지 않으며, 모든 소스가 공통적으로 메인 스레드의 지연을 없애고 메모리 관리 효율성을 높이기 위한 최적화 프로젝트로 일관되게 설명하고 있습니다.

Last updated: 2026-04-19



  • Related Topics: 가비지 컬렉션(Garbage Collection), V8 엔진(V8 Engine), 스캐빈저(Scavenger), 메이저 GC(Major GC)
  • Projects/Contexts: 자바스크립트(JavaScript), 크롬 브라우저(Chrome Browser)
  • Contradictions/Notes: 점진적(Incremental) GC 기법은 메인 스레드에서 소요되는 전체 총시간을 줄여주지는 않으며 오히려 약간 늘릴 수도 있습니다. 하지만 GC 작업을 여러 시간에 걸쳐 분산시킴으로써 애플리케이션의 애니메이션이나 사용자 입력에 대한 응답성을 유지할 수 있도록 돕습니다 [10].

Last updated: 2026-04-19