Java 의 미래 Virtual Thread

참고 링크

1. Virtual Thread 소개

2018 년 Project Loom 으로 시작된 경량 스레드 모델

2023년 JDK21 에 정식 feature 추가

  • 스레드 생성 및 스케줄링 비용이 기존 스레드보다 저렴

  • 스레드 스케줄링을 통해서 Non-Blocking I/O 지원

  • 기존 스레드를 상속하여 코드 호환

1.1 스레드 생성 / 스케줄링 속도가 빠르다.

기존 자바 스레드는 생성 비용이 크다.

  • 스레드 풀의 존재 이유

  • 사용 메모리 크기가 크다 (공간적 비용, 최대 2MB)

  • OS 에 의해 스케줄링 (1:1 매핑)

Virtual Thread 는 생성 비용이 작다.

  • 스레드 풀 개념 X

    • 요청이 들어올때마다 생성되고,

    • 응답이 나갈때마다 파괴된다.

  • 사용 메모리 크기가 작다. (최대 50KB)

  • OS 가 아닌 JVM 내 스케줄링

1.2 Non-Blocking I/O 지원

증가하는 I/O blocking time Thread per request 모델에서 특히 병목이 되는 blocking time

Non-Blocking I/O 는 Blocking time 을 획기적으로 줄여준다.

Virtual Thread Non-Blocking I/O

  • JVM 스레드 스케줄링

  • Continuation 활용

1.3 기존 스레드 상속

2. Virtual Thread 동작 원리

2.1 일반 스레드 특징

  • 플랫폼 스레드

  • OS 에 의해 스케줄링

  • 커널 스레드와 1:1 매핑

  • 작업 단위 Runnable

2.2 Virtual Thread 특징

  • 가상 스레드

  • JVM 에 의해 스케줄링

    • Thread 는 생성 및 스케줄링 시 커널 영역 접근

    • Virtual Thread 는 커널 영역 접근 없이 단순하게 Java 객체 생성 가능

    • 즉, Virtual Thread 는 생성 시 시스템 콜 X

  • 캐리어 스레드와 1:N 매핑

  • 작업 단위 Continuation

2.3 Continuation 작업 단위

Kotlin 코루틴 동작방식

Continuation (컨텍스트 스위칭 방식이랑 비슷)

  • 실행 가능한 작업 흐름

  • 중단 가능

  • 중단 지점으로부터 재실행 가능

Continuation 사용 이유

  • Thread 는 작업 중단을 위해 커널 스레드를 중단

  • Virtual Thread 는 작업 중단을 위해서 Continuation yield

  • 작업이 block 되어도 실제 스레드는 중단되지 않고 다른 작업 처리

  • 커널 스레드 중단이 없으므로 시스템 콜 X -> 컨텍스트 스위칭 비용이 낮다.

3. 기존 스레드 모델 서버와 비교

3.1 기존 스레드 모델

3.2 Virtual Thread 모델

4. 성능 테스트

5. 서비스 적용 시 주의사항

Last updated