SW/Java

Java 21, Java의 주요 단계: Non-blocking IO 및 업그레이드된 ZGC

얇은생각 2024. 1. 6. 07:30
반응형

Virtual Threads가 개발자 및 전체 Java 에코시스템에 미치는 주요 이점과 Java의 이미 견고한 GC 기능에서 ZGC가 어떻게 향상되는지 알아보겠습니다.

자바 21은 노드 JS에 강력한 도전을 할 것으로 보입니다! 자바 21에는 두 가지 엄청난 성능 향상이 있는데, 이들은 자바의 자주 비판 받는 두 가지 영역을 해결합니다: 스레드와 블록 IO (일부 공정한 비판) GC (상대적으로 불공정한 비판)

 

자바 21의 주요 하이라이트: 

프로젝트 룸 및 가상 스레드

ZGC (upgraded)

 

 

Java 21, Java의 주요 단계: Non-blocking IO 및 업그레이드된 ZGC

 

 

1. 가상 스레드

오랫동안 비차단 IO, 비동기 작업, 그리고 비동기 작업을 조정하기 위한 Promise Async/Awit를 살펴보았습니다. 그래서 콜백을 처리하고 Promise.all() 또는 Completeable Future()와 같은 작업을 수행해야 했습니다. 그런 다음 ()를 구성하여 여러 비동기 작업에 참여하고 결과를 처리합니다.

최근에는 반응형 프레임워크가 등장하여 작업을 기능 파이프라인으로 "구성"한 다음 스레드 풀이나 실행기에서 실행하고 있습니다. 반응형 함수 프로그래밍은 "콜백 헬"보다 훨씬 낫기 때문에 기능형 프로그래밍 모델로 옮겨 비차단/비동기화를 우아한 방식으로 수행할 수밖에 없었습니다.

가상 스레드는 콜백과 약속에 종지부를 찍고 있습니다. 자바 팀은 쓰레기 값이 싼 가상 스레드로 스레드를 거의 대체하는 데 성공했습니다. 따라서 이전 Thread.sleep(5000)을 수행하더라도 가상 스레드는 차단 대신 분리됩니다. 숫자 면에서 일반 노트북은 2000~5000개의 스레드를 수행할 수 있지만 동일한 시스템은 100만개 이상의 가상 스레드를 수행할 수 있습니다. 사실 공식 권장 사항은 가상 스레드의 풀링을 피하는 것입니다. 모든 작업을 새로운 가상 스레드에서 실행하는 것이 좋습니다. 가상 스레드는 sleep, wait, ThreadLocal, Locks 등 모든 것을 지원합니다.

가상 스레드를 사용하면 일반적인 오래된 반복 코드와 "차단된 것처럼 보이는" 코드를 작성하고 자바가 실제 스레드를 분리/부착하여 비차단 및 고성능화할 수 있습니다. 하지만 Apache Tomcat Spring과 같은 라이브러리/프레임워크 구현자가 네이티브 스레드에서 가상 스레드로 모든 것을 이동할 때까지는 기다려야 합니다. 프레임워크가 전환을 완료하면 이러한 업그레이드된 프레임워크를 사용하는 모든 Java 마이크로서비스/모놀리스는 자동으로 비차단 상태가 됩니다.

애플리케이션에서 접하는 스레드 풀의 예를 들어보세요 - Apache Tomcat NIO 25 - 50개의 워커 스레드를 가지고 있습니다. NIO 50,000개의 가상 스레드를 가질 수 있다고 상상해보세요. Apache Camel 청취자는 보통 10 - 20개의 스레드를 가지고 있습니다. Camel 1000 - 2000개의 가상 스레드를 가질 수 있다고 상상해보세요.

물론, 가상 스레드가 있는 스레드 풀은 더 이상 없으므로, 스레드는 무제한으로 1000개의 스레드를 가질 것입니다. 이것은 자바에서 " 스레드 기아"를 완전히 멈추게 합니다. Java 21을 완전히 활용하는 Frameworks / Libraries로 업그레이드하는 것만으로도 모든 Java 마이크로 서비스는 기존 코드만으로 차단되지 않습니다.

(Caveat: 동기화된 작업과 같은 일부 작업은 가상 스레드도 차단합니다. 그러나 Lock.lock()과 같이 가상 스레드가 지원하는 대체 작업으로 대체할 경우, 가상 스레드는 잠금을 획득할 때까지 분리하여 다른 작업을 수행할 수 있습니다. 이를 위해서는 라이브러리 작성자로부터 약간의 코드 변경이 필요하며, 경우에 따라서는 프로젝트 코드 기반에서 가상 스레드의 이점을 얻을 수 있습니다.).

 

 

2. ZGC

이제 ZGC는 테라바이트 크기의 Java Heaps를 지원하며, millisecond 미만의 영구적인 일시 중지 기능을 갖추고 있습니다. 하지만 중요한 주의사항은 없습니다. 메모리 용량이 5~10% 증가하거나 할당 속도가 5~10% 느려질 수도 있지만, 일반적인 GC 일시 중지 기능은 더 이상 사용할 수 없으며, 힙 크기 제한도 더 이상 사용할 수 없습니다.

이 두 가지 성능 개선을 통해 프로그래밍 언어 중 자바의 위치가 강화될 것입니다. 이는 노드 JS의 지배력 증가와 어느 정도 반응형 프로그래밍을 중단시킬 수 있습니다. 반응형/기능형 프로그래밍은 코드 판독성과 이벤트 중심의 애플리케이션 관리에 여전히 좋을 수 있지만, 자바에서 비차단 IO를 수행하기 위해 반응형 프로그래밍은 더 이상 필요하지 않습니다.

반응형