피드로 돌아가기
Deep Dive: How JetBrains Fleet Indexes 1M Line Codebases with Rust 1.85 and Kotlin 2.0
Dev.toDev.to
Infrastructure

Rust 1.85와 Kotlin 2.0 기반 1M 라인 코드 780ms 인덱싱 달성

Deep Dive: How JetBrains Fleet Indexes 1M Line Codebases with Rust 1.85 and Kotlin 2.0

ANKUSH CHOUDHARY JOHAL2026년 4월 29일13advanced

Context

기존 IntelliJ IDEA의 인덱싱 구조는 높은 메모리 오버헤드와 JVM 기반의 성능 한계 존재. 대규모 코드베이스 처리 시 발생하는 GC 부하와 메모리 점유율 문제를 해결하기 위한 새로운 아키텍처 필요.

Technical Solution

  • Rust 1.85 기반의 Core Indexer를 구축하여 파일 I/O, 파싱, 인덱스 저장 등 성능 임계 경로를 네이티브 영역으로 분리
  • tokio async/await 및 mpsc channel을 활용한 파일 감시자와 인덱스 작성자 간의 디커플링으로 I/O 병목 제거
  • Kotlin 2.0 Value Class를 통한 FFI 포인터 래핑으로 JVM 힙 할당 오버헤드를 0ns까지 제거한 Zero-cost Abstraction 구현
  • JNI 기반 FFI Bridge에서 Direct ByteBuffer를 활용한 Zero-copy 전송 방식을 채택하여 데이터 복사 비용 최소화
  • Arc 및 RwLock을 이용한 Rust 내부의 공유 상태 관리로 멀티코어 환경의 인덱싱 효율 극대화

Impact

  • 1M 라인 Java 코드베이스 인덱싱 시간 평균 780ms(p99 1.2s) 달성
  • IntelliJ IDEA 대비 메모리 사용량 40% 감소 및 프로젝트당 약 2.4GB RAM 절감
  • Kotlin Value Class 도입으로 FFI 호출당 오버헤드 120ns에서 0ns로 개선
  • Zero-copy 전송을 통한 데이터 전송 오버헤드 최대 70% 감소
  • Rust 1.85와 Kotlin 2.0 조합으로 메모리 할당 오버헤드 62% 감소

Key Takeaway

성능 임계 경로(Critical Path)를 네이티브 언어로 분리하고, 언어 간 경계(FFI)에서 발생하는 메모리 복사와 할당 비용을 Zero-copy 및 Value Type으로 최적화하는 하이브리드 설계의 중요성.


- JVM 기반 시스템의 성능 병목 지점에 Rust/C++ 네이티브 라이브러리 도입 검토 - FFI 통신 시 Heap 기반 배열 대신 Direct ByteBuffer를 사용한 Zero-copy 인터페이스 설계 - 빈번한 FFI 호출이 발생하는 경우 Kotlin Value Class 등 래퍼 객체의 힙 할당 제거 방안 적용 - 생산자-소비자 패턴의 I/O 작업에 async runtime과 channel을 통한 비동기 디커플링 적용

원문 읽기