피드로 돌아가기
Spring Boot 3.x + Java 21 虚拟线程场景下 MDC 异步上下文丢失与内存溢出排查实战
Dev.toDev.to
Backend

Spring Boot 3.x + Java 21 虚拟线程场景下 MDC 异步上下文丢失与内存溢出排查实战

Java 21 Virtual Thread 환경의 MDC 메모리 누수 및 컨텍스트 오염 해결

钟志敏2026년 6월 15일2advanced

Context

Spring Boot 3.x 및 Java 21 Virtual Threads 도입으로 고처리량 시스템을 구축했으나, 기존 ThreadLocal 기반의 MDC 메커니즘이 가상 스레드의 잦은 중단 및 재스케줄링과 충돌하는 구조적 한계 발생. 특히 I/O 블로킹 시 가상 스레드가 Carrier Thread에 고정되는 Pinning 현상과 결합하여 컨텍스트 유실 및 Heap 메모리 누수로 인한 OOM 위험 노출.

Technical Solution

  • Scoped Value 도입을 통한 ThreadLocal 대체로 불변 데이터 공유 및 생명주기 자동 관리 체계 구축
  • ScopedValue.where()를 활용한 명시적 범위 지정으로 가상 스레드 간 데이터 오염 원천 차단
  • TaskDecorator 구현을 통한 비동기 전파 시 MDC 컨텍스트의 명시적 복사 및 전달 로직 설계
  • finally 블록 내 MDC.clear() 강제 수행으로 Carrier Thread에 잔류하는 컨텍스트 데이터 완전 제거
  • 가상 스레드 핀닝(Pinning)을 유발하는 synchronized 블록 및 Native Method 사용 최소화 전략 적용

- Java 21 가상 스레드 환경에서 MDC 사용 시 반드시 TaskDecorator를 통한 컨텍스트 전파 및 명시적 clear 수행 여부 검토 - 대규모 가상 스레드 운용 시 ThreadLocal 대신 Scoped Value 도입을 통한 메모리 효율성 및 스레드 안전성 확보 - synchronized 블록 내 I/O 작업이 가상 스레드의 Pinning을 유발하여 성능 저하 및 메모리 누수를 일으키는지 프로파일링 수행

원문 읽기