기존 vs. 21버전 스레드 모델
기존 Java 스레드 모델: Native Thread
- 기존의 KLT(kernel-level thread)와 ULT(user-level thread)를 1:1 매핑하여 사용하는 JVM의 스레드 모델
- Java의 유저 스레드를 만들면 Java Native Interface(JNI)를 통해 커널 영역을 호출하여 OS가 커널 스레드를 생성하고 매핑하여 작업을 수행하는 형태
JNI: JVM에서 다른 언어를 사용할 수 있게 함. 메서드 앞에 native 키워드를 붙여 사용. - 기존 프로세스 모델을 잘게 쪼개 프로세스 내의 공통된 부분은 공유하면서, 작은 여러 실행단위를 번갈아 가면서 수행할 수 있도록 만듦
- 커널 스레드와 유저 스레드가 매핑
단점
- 메모리가 제한된 환경에서는 생성할 수 있는 스레드 수에 한계가 있었고, 스레드가 많아지면서 컨텍스트 스위칭 비용도 기하급수적으로 늘어나게 됨
- 생성을 위해선 커널과 통신하여 스케줄링해야 하므로, 시스템 콜을 이용하기 때문에 생성 비용도 적지 않음
컨텍스트 스위치
Java의 스레드는 I/O, interrupt, sleep과 같은 상황에 block/waiting 상태가 되는데, 이때 다른 스레드가 커널 스레드를 점유하여 작업을 수행하는 것. 컨텍스트 스위칭 시 메모리 이동량이 큼
Java 21 스레드 모델: Virtual Thread
- 여러 개의 가상 스레드를 하나의 네이티브 스레드에 할당하여 사용하는 모델
- 더 많은 요청 처리량과 컨텍스트 스위칭 비용을 줄이기 위해 나타난 경량 스레드 모델
- 플랫폼 스레드 위에서 여러 Virtual Thread가 번갈아 가며 실행되는 형태
장점
- 컨텍스트 스위칭 비용이 저렴
- JVM에 의해 생성되기 때문에 시스템 콜과 같은 커널 영역의 호출이 적고, 메모리 크기가 일반 스레드의 1%에 불과
단점
- I/O 작업 없이 CPU 작업만 수행하는 경우, 오히려 플랫폼 스레드보다 성능이 떨어짐
- 가상 스레드는 JVM에서의 컨텍스트 스위칭 오버헤드가 존재하기 때문
- 메모리 누수 혹은 메모리 에러 발생 가능성 있는 Thread Local 사용 시 주의
'Java > Java' 카테고리의 다른 글
[Java(자바)] Stream(스트림) (0) | 2024.05.21 |
---|---|
[Java(자바)] JVM(Java Virtual Machine) (0) | 2024.05.12 |
[Java(자바)] 자바의 Thread(쓰레드) (0) | 2024.05.12 |
[Java(자바)] 메모리 관리와 가비지 컬렉션 (0) | 2024.05.12 |
[Java(자바)] Java 접근제어자 (0) | 2024.05.12 |