본문 바로가기
study/java

JAVA 21 Virtual Threads

by eunoia_DB 2024. 6. 8.

 

회사에서 자바 21을 도입하면서 기존 자바 버전과 다른 새로운 기능이 무엇이 있을까 알아보았다. 그 과정에서
Kakao Tech Meet의 발표 영상 을 보게 되었고 Virtual Threads에 대한 여러 정보를 얻을 수 있었다.

 

 

자바 애플리케이션에서 스레드를 사용하는 방식은 기존에 OS 스레드를 래핑 하여 사용하는 플랫폼 스레드 형태이다.
이는 자바의 스레드가 실제로는 OS의 스레드를 사용하는 것을 의미한다. 그러나 OS 스레드에는 생성 개수 제한과 높은
유지

비용이라는 단점이 있다. 이러한 단점을 극복하기 위해 플랫폼 스레드를 사용할 때는 스레드 풀을 활용하여 스레드를 관리한다.

 

 

플랫폼 스레드와 웹 요청 처리 문제

전통적으로 자바의 웹 요청 처리 방식은 하나의 요청당 하나의 스레드를 사용하는 방식이다. 요청이 많아지면 자연스럽게

스레드도 많아지며 OS 스레드의 생성 갯수 제한 때문에 많은 양의 웹 요청을 처리하는 데 한계가 발생한다. 이는 결국 트래픽

처리에 문제를 초래할 수 있다.

 

1) Blocking I/O

스레드가 I/O 작업을 처리할 때 작업 처리 시간보다 대기 시간이 길어 비효율적이다.

이를 해결하기 위해 리액티브 프로그래밍(reactive programming)을 활용할 수 있다.

Reactive Programming, 예를 들어 WebFlux를 사용하면, 스레드는 대기하지 않고 다른 작업을 처리할 수 있다.

하지만 이는 몇 가지 단점을 수반한다.

 

- 코드 작성과 기술 이해에 많은 시간과 비용 소비

- 리액티브하게 동작하는 라이브러리가 필요

- 동기식 코드에서 리액티브 코드로 전환하는 것이 어려움

- JPA를 사용할 수 없고, R2DBC 사용 필요

 

특히 리액티브 프로그래밍은 자바의 기존 디자인과 차이가 있다.

자바는 스레드 중심으로 디자인되어 있으며, 예외 스택 트레이스, 디버깅, 프로파일링 모두 스레드 기반이다.

하지만 리액티브 프로그래밍에서는 작업이 여러 스레드를 거치기 때문에 콘텍스트 확인이 어려워 디버깅이 복잡해진다.

 

 

가상 스레드의 도입

자바 21에서는 이러한 문제를 해결하기 위해 가상 스레드(Virtual Threads)가 도입되었고

이를 통해 다음과 같은 문제를 해결하고자 한다.

 

1) 애플리케이션의 높은 처리량 확보

블로킹 발생 시 내부 스케줄링을 통해 다른 작업을 처리하여 효율성을 높인다.

 

2) 자바 플랫폼 디자인과의 조화

리액티브 프로그래밍은 기존 자바 플랫폼 디자인과 달라 디버깅이 어려웠지만, 가상 스레드는 기존 스레드 구조를 그대로 사용한다.

따라서 가상 스레드는 기존 코드를 그대로 활용할 수 있어 높은 처리량을 유지하면서 코드 이해도가 높아진다.

 

 

플랫폼 스레드와 가상 스레드 비교

기존의 플랫폼 스레드는 OS 스레드와 1대1로 매핑되어 사용된다. 반면, 가상 스레드는 캐리어 스레드와 연동된다.

여기서 캐리어 스레드는 OS 스레드와 1대1로 매핑되어 있으며 가상 스레드는 애플리케이션에서 실제로 사용된다.

 

 

 

 

 

I/O 블로킹이 발생하면 가상 스레드는 캐리어 스레드와 분리되고, 해당 캐리어 스레드는 다른 가상 스레드와 마운트 되어 연결된다.

이를 통해 대기 시간 없이 다른 작업을 처리할 수 있다. 또한 가상 스레드는 각 작업(task)별로 할당되어 사용된다.

 

 

가상 스레드 사용 시 유의 사항

 

1) 가상 스레드로의 전환

각 task별로 가상 스레드 할당이 필요하다.

 

2) 스레드 로컬 사용 주의

가상 스레드는 힙(heap)을 사용하므로, 남발하면 메모리 사용이 증가한다.

 

3) synchronized 사용 시 주의

가상 스레드가 캐리어 스레드와 마운팅될 때 블로킹이 발생할 수 있다. 이를 pinning이라고 하며 서드파티 라이브러리 내

synchronized가 있는 경우 문제가 발생할 수 있습니다. ReentrantLock을 사용하여 pinning 문제를 방지할 수 있다.

 

 

 

 

 

 

 


Reference


https://tech.kakao.com/posts/608

https://www.happycoders.eu/java/virtual-threads/

댓글