SW/Java

Java의 미래: JDK 21의 가상 스레드와 그 영향

얇은생각 2023. 12. 9. 07:30
반응형

이 기사에서는 JDK 21에 가상 스레드를 추가하고 자바의 미래에 미치는 영향에 대해 설명합니다.

2023 9 19일에 출시된 JDK 21은 자바의 진화에 중요한 이정표를 세웠습니다. 장기 지원(LTS) 릴리스로, 최소 8년 동안 오라클의 안정성과 지원을 보장합니다. 이번 릴리스에서는 자바 개발자들에게 가상 스레드, 레코드 패턴, 스위치 문의 패턴 매칭, 외부 기능 및 메모리 API, ZGC 가비지 콜렉터 등 몇 가지 새로운 기능을 소개합니다.

 

 

Java의 미래: JDK 21의 가상 스레드와 그 영향

 

 

가상 스레드의 중요성

이러한 기능 중 가상 스레드는 동시 실행 자바 애플리케이션의 세계에서 게임 체인저로 주목받고 있습니다. 가상 스레드는 개발자가 동시 코드를 작성하고 관리하는 방식에 혁신을 일으킬 가능성이 있습니다. 이들은 뛰어난 이점을 제공하여 처리량이 많은 동시 실행 애플리케이션에 이상적입니다.

 

가상 스레드의 장점

가상 스레드는 기존 플랫폼 스레드와 차별화되는 다음과 같은 몇 가지 이점을 테이블에 제공합니다:

효율적인 메모리 사용: 가상 스레드는 기존 스레드에 비해 메모리 사용량이 현저히 적습니다. JVM은 가상 스레드의 메모리를 지능적으로 관리하여 여러 가상 스레드에 대해 재사용 및 효율적인 할당을 가능하게 합니다.

CPU 사용량 최적화: 가상 스레드는 CPU 효율성이 더 높습니다. JVM은 동일한 기본 OS 스레드에 여러 가상 스레드를 예약할 수 있으므로 컨텍스트 전환의 오버헤드를 제거합니다.

사용 편의성: 가상 스레드는 작업하고 관리하기가 더 쉽습니다. JVM은 라이프사이클을 관리하여 수동으로 생성하고 파괴할 필요가 없습니다. 이를 통해 동시에 자바 애플리케이션을 개발하고 유지보수할 수 있습니다.

 

스레드 유형 이해

가상 스레드의 중요성을 파악하기 위해 다음 세 가지 유형의 스레드를 간단히 살펴봅니다:

1. OS 스레드 (Native Threads): 현대 운영체제에서 기본적인 실행 단위입니다. OS 스레드는 OS 커널이 관리하는 자체 스택, 프로그램 카운터 및 레지스터 세트가 있습니다.

2. 플랫폼 스레드(Traditional Java Thread): 플랫폼 스레드는 OS 스레드 위에 구축되지만 자바 가상 머신(JVM)에 의해 관리됩니다. 이들은 보다 효율적인 스케줄링과 자원 활용을 제공합니다. 플랫폼 스레드는 전통적인 방식으로 구현된 java.lang.Thread의 인스턴스로 OS 스레드 주변의 얇은 래퍼로 구성됩니다.

3. 가상 스레드: 가상 스레드는 java.lang의 인스턴스입니다. 스레드는 특정 OS 스레드에 바인딩되지 않습니다. 하나의 OS 스레드에서 여러 개의 가상 스레드를 서비스할 수 있습니다. 가상 스레드는 기존 스레드보다 훨씬 가볍고 효율적이며 동시 자바 애플리케이션의 성능, 확장성 및 신뢰성을 향상시키는 데 사용할 수 있습니다.

 

전통 스레드의 도전

스레드는 동시 서버 응용 프로그램의 구성 요소이며 거의 30년 동안 자바에 통합되어 왔습니다. 불행히도, 기존의 자바 스레드는 만들고 유지 관리하는 데 비용이 많이 듭니다. JDK는 운영 체제(OS) 스레드 주변의 래퍼(wrapper)로 스레드를 구현하기 때문에 사용 가능한 스레드 수가 제한됩니다. OS 스레드는 비용이 많이 들기 때문에 너무 많은 스레드를 가질 수 없으며, 이로 인해 자바 서버가 처리할 수 있는 동시 요청 수를 제한하여 서버 응용 프로그램 확장성에 영향을 미치는 요청당 스레드 스타일에 적합하지 않습니다.

 

스레드 공유로의 전환

자바 개발자들은 일정 기간 동안 하드웨어를 최대한 확장하고 활용할 수 있도록 스레드별 요청 스타일에서 스레드 공유 스타일로 전환했습니다. 스레드 공유에서는 처음부터 끝까지 하나의 스레드에서 요청을 처리하는 대신 요청 처리 코드는 스레드가 다른 요청에 서비스할 수 있도록 다른 I/O 작업이 완료될 때까지 기다릴 때 해당 스레드를 풀로 반환합니다.

이렇게 세분화된 공유를 통해 스레드는 절약되지만 비동기 프로그래밍 기법이 필요합니다. 비동기 프로그래밍은 확장성을 향상시키기 위한 복잡하고 오류가 발생하기 쉬운 방법이며 자바 서버 응용 프로그램에서 일반적으로 사용되는 요청별 스레드 스타일과는 호환되지 않습니다.

 

가상 스레드 소개

가상 스레드는 요청별 스레드 스타일을 유지하면서 동시성을 강화하는 강력한 솔루션을 제공합니다. 특정 OS 스레드에 연결되지 않으므로 동시성이 향상됩니다. 가상 스레드는 CPU 바인딩된 작업 중에만 OS 스레드를 소비합니다. 차단 I/O 작업이 발생하면 OS 스레드를 독점하지 않고 자동으로 중단됩니다. 가상 스레드를 생성하고 관리하는 것이 간단하여 풀링이 필요하지 않습니다.

가상 스레드는 수명이 짧고 특정 작업을 수행하며 풍부합니다. 플랫폼 스레드는 무겁고 수명이 길고 풀링이 필요할 수 있습니다. 가상 스레드를 사용하면 하드웨어 활용도를 최적화하면서 요청별 스레드 스타일을 유지할 수 있습니다.

 

JDK와 함께하는 미래 21

JDK 21을 사용하면 기존의 스레드 구현을 대체하는 것이 아니라 효율적인 대안을 제공하는 것이 목표라는 점에 주목해야 합니다. 개발자는 자신의 특정 요구 사항에 따라 가상 스레드와 플랫폼 스레드 중 하나를 선택할 수 있는 유연성을 유지합니다.

가상 스레드의 성능을 보여주는 간단한 예는 다음과 같습니다:

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {

     IntStream.range(0, 10_000).forEach(i -> {

         executor.submit(() -> {

             Thread.sleep(Duration.ofSeconds(1));

             return i;

         });

     });

     // Wait for all tasks to complete.

} // The executor is automatically closed, and it waits for task completion.

 

 

이 예에서는 최신 하드웨어가 10,000개의 가상 스레드를 동시에 효율적으로 처리하여 간단한 코드를 실행합니다.

그 이면에서 JDK는 이러한 가상 스레드를 효율적으로 관리하여 리소스 활용률을 최적화합니다.

 

 

결론

자바 개발자들은 오랫동안 동시 프로그래밍을 위해 스레드에 의존해 왔습니다. JDK 21에 가상 스레드가 도입되면서 익숙한 프로그래밍 스타일을 유지하면서 높은 동시성을 달성하는 것이 쉬워졌습니다. 가상 스레드는 변화하는 환경에서 효율성과 확장성을 제공하면서 수많은 사용자 요청을 처리하는 서버 애플리케이션에 특히 유용합니다.

반응형