Java 24 / JDK 24 출시(GA)
(jdk.java.net)- Oracle이 자바 24 (JDK 24) 출시를 공식 발표
- JDK 24는 JCP의 JSR 399에서 지정한 Java SE Platform 버전 24의 기준 구현으로, JDK 릴리스 프로세스(JEP 3) 를 통해 출시됨
[JEP별 요약]
-
JEP 404: Generational Shenandoah (실험적)
- Shenandoah GC에서 세대별 수집을 지원하여 성능 개선
-
JEP 450: Compact Object Headers (실험적)
- HotSpot JVM에서 객체 헤더 크기를 96~128비트에서 64비트로 줄임
- 힙 크기 감소, 배포 밀도 향상 및 데이터 지역성 개선 효과 기대
-
JEP 472: Prepare to Restrict the Use of JNI
- JNI(Java Native Interface) 사용 시 경고 추가
- 외부 함수 및 메모리(FFM) API에서 일관된 경고 제공
- 향후 JNI 및 FFM API의 사용 제한을 대비해 경고 제공
- 애플리케이션에서 필요할 경우 선택적으로 인터페이스 활성화 가능
-
JEP 475: Late Barrier Expansion for G1
- G1 가비지 컬렉터의 Barrier 구현 간소화
- C2 JIT 컴파일러의 초기 단계에서 후반 단계로 Barrier 확장 시점 조정
-
JEP 478: Key Derivation Function API (미리보기)
- 암호화 키 파생 기능을 제공하는 Key Derivation Function (KDF) API 도입
- 비밀 키 및 기타 데이터를 통해 추가 키 파생 가능
-
JEP 483: Ahead-of-Time Class Loading & Linking
- 핫스팟 JVM 시작 시 애플리케이션 클래스 즉시 사용 가능
- 한 번 실행 시 로드 및 링크된 상태를 캐시에 저장해 이후 실행 시 빠른 시작 가능
-
JEP 484: Class-File API
- Java 클래스 파일의 파싱, 생성 및 변환을 위한 표준 API 제공
-
JEP 485: Stream Gatherers
- Stream API에 사용자 정의 중간 연산 지원
- 기존 중간 연산으로는 어려운 데이터 변환 가능
-
JEP 486: Permanently Disable the Security Manager
- 보안 관리자는 클라이언트 측 코드에서 주된 보안 수단이 아니었음
- Java 17(JEP 411)에서 제거 예정으로 비활성화 조치
- 보안 관리자 API는 향후 릴리스에서 완전히 제거 예정
-
JEP 487: Scoped Values (네 번째 미리보기)
- 스레드 내에서 불변 데이터를 자식 스레드와 공유하는 Scoped Values 도입
- 스레드 로컬 변수보다 메모리 및 시간 비용 절감 가능
- 가상 스레드 및 구조적 동시성과 함께 사용 시 성능 개선 기대
-
JEP 488: Primitive Types in Patterns, instanceof, and switch (두 번째 미리보기)
- 패턴 매칭에서 기본 타입 지원
-
instanceof
및switch
에서 모든 기본 타입 사용 가능
-
JEP 489: Vector API (아홉 번째 인큐베이터)
- 벡터 연산을 위한 API 도입
- 벡터 명령어로 컴파일되어 스칼라 연산보다 성능 향상 기대
-
JEP 490: ZGC: Remove the Non-Generational Mode
- ZGC의 비세대 모드를 제거하고 세대 모드를 기본값으로 설정
-
JEP 491: Synchronize Virtual Threads without Pinning
-
synchronized
구문에서 가상 스레드가 플랫폼 스레드를 해제하도록 개선 - 가상 스레드가 플랫폼 스레드에 고정되지 않게 하여 성능 및 확장성 개선
-
-
JEP 492: Flexible Constructor Bodies (세 번째 미리보기)
- 명시적 생성자 호출(
super(..)
,this(..)
) 전에 문장 허용 - 인스턴스가 완전히 초기화되기 전에 필드 초기화 가능
- 명시적 생성자 호출(
-
JEP 494: Module Import Declarations (두 번째 미리보기)
- 모듈에서 내보낸 패키지를 간단하게 가져오는 선언 추가
- 모듈화된 라이브러리의 재사용 간소화
-
JEP 495: Simple Source Files and Instance Main Methods (네 번째 미리보기)
- 초보자도 쉽게 작성할 수 있는 간단한 소스 파일 및 메서드 지원
- 복잡한 코드 없이 간단한 프로그램 작성 가능
-
JEP 496: Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism
- 양자 저항성 Module-Lattice-Based Key Encapsulation Mechanism (ML-KEM) 도입
- 대칭 키 보안을 강화하고 양자 컴퓨팅 공격에 대비
-
JEP 497: Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm
- 양자 저항성 Module-Lattice-Based Digital Signature Algorithm (ML-DSA) 도입
- 데이터 위변조 방지 및 서명자 인증 강화
- 향후 양자 컴퓨팅 공격 대응
-
JEP 498: Warn upon Use of Memory-Access Methods in sun.misc.Unsafe
-
sun.misc.Unsafe
의 메모리 접근 메서드 사용 시 경고 제공 - VarHandle API 및 FFM API로 마이그레이션 권장
-
-
JEP 499: Structured Concurrency (네 번째 미리보기)
- 관련 작업 그룹을 단일 작업 단위로 처리하는 구조적 동시성 도입
- 오류 처리 및 취소 간소화, 신뢰성 및 가시성 개선
[JDK 24 신규 기능 요약]
-
Configurable New Session Tickets Count for TLSv1.3
- 새 시스템 속성
jdk.tls.server.newSessionTicket
추가 - JSSE 서버에서 TLSv1.3 재개 티켓 수를 설정 가능 (0~10 범위)
- 기본값은 1로 설정됨
- 명령어 예제:
java -Djdk.tls.server.newSessionTicket=2
- 새 시스템 속성
-
Mechanism to Disable TLS Cipher Suites by Pattern Matching
-
java.security
설정 파일에서jdk.tls.disabledAlgorithms
속성을 통해 TLS 암호화 제품군 비활성화 가능 - 패턴 매칭 지원 (
_
와일드카드 사용 가능) - 예제:
"TLS_RSA_*"
는 TLS_RSA로 시작하는 모든 암호 제품군 비활성화
-
-
New Option to Extract a JAR File to a Specific Directory Using the jar Tool
-
jar
도구에 새로운--dir
및-C
옵션 추가 - 특정 디렉토리에 JAR 파일의 내용을 추출 가능
- 예제:
jar -xf foo.jar -C /tmp/bar/ jar --extract --file foo.jar --dir /tmp/bar/
-
-
New Reader.of(CharSequence) Method
- 새로운 정적 팩토리 메서드
java.io.Reader.of(CharSequence)
추가 -
String
,StringBuilder
등에서 효율적으로 읽기 지원
- 새로운 정적 팩토리 메서드
-
New Method Process.waitFor(Duration)
-
java.lang.Process#waitFor(Duration)
메서드 추가 - 기존
waitFor()
에서 단위 설정의 혼란 방지
-
-
Support for Unicode 16.0
- Unicode 16.0 지원 추가
- 총 154,998자 및 7개 신규 스크립트 추가
- Garay (서아프리카)
- Gurung Khema, Kirat Rai, Ol Onal, Sunuwar (인도 및 네팔)
- Todhri (알바니아)
- Tulu-Tigalari (인도 남서부)
-
New JAR Command Option to Not Overwrite Existing Files
-
jar
도구에--keep-old-files
및-k
옵션 추가 - 기존 파일 덮어쓰기 방지 가능
- 예제:
jar xkf foo.jar jar --extract --keep-old-files --file foo.jar
-
-
New MXBean to Monitor and Manage Virtual Thread Scheduler
-
jdk.management.VirtualThreadSchedulerMXBean
인터페이스 추가 - 가상 스레드 스케줄러 상태 및 병렬 처리 모니터링 가능
- 스케줄러의 목표 병렬성을 동적으로 변경 가능
-
-
New jcmd Commands Thread.vthread_scheduler and Thread.vthread_pollers
-
jcmd
도구에 새로운 명령 추가-
Thread.vthread_scheduler
: 스레드 스케줄러 상태 출력 -
Thread.vthread_pollers
: I/O 폴러 상태 출력
-
-
-
Support for Including Security Properties Files
-
java.security
설정 파일에서 다른 속성 파일 포함 가능 -
include <파일 경로>
사용 -
include
키워드는 속성 이름으로 사용할 수 없음
-
-
Document Standard Hash and MGF Algorithms for RSASSA-PSS Signature
- RSASSA-PSS 서명에서 사용할 수 있는 표준 해시 및 메시지 생성 함수 문서화
-
SunPKCS11 Provider Is Enhanced to Use CKM_AES_CTS Mechanism
- SunPKCS11 공급자에서 AES/CTS 변환 지원 추가
- 새로운 설정 속성
cipherTextStealingVariant
추가 (CS1, CS2, CS3) - NSS의 경우 기본값은 CS1로 설정됨
-
New Summary Page for External Specifications
- Java SE 및 JDK API에서 참조하는 외부 명세를 한눈에 볼 수 있는 요약 페이지 추가
-
jpackage Supports WiX Toolset v4 and v5 on Windows
-
jpackage
에서 WiX Toolset v4 및 v5 지원 추가 - 최신 설치 버전을 자동 선택
- WiX v3 포맷의 사용자 정의 소스를 v4 포맷으로 자동 변환
-
-
Add W3C DTDs and XSDs to the JDK Built-in Catalog
- JDK의 내장 XML 카탈로그에 W3C의 DTD 및 XSD 추가
- 네트워크 없이 로컬에서 로딩 가능
- 추가된 항목:
- xml 네임스페이스
- XML Schema Part 1 & 2
- XHTML 1.0 & 1.1
- W3C XML 명세 DTD
Project Valhalla가 정말 오랫동안 개발중인데 좋은 결실을 맞았으면 하네요.
개인적으로는 value class의 flat한 구조가 포인터 참조를 줄여서 메모리 접근속도 이점이 생기는 부분이 크다고 기대하고 있습니다.
Kotlin의 (긍정적인) 영향들을 많이 받고 있네요. 요즘에 코틀린 언어를 쓰면서 정말 만족하고 있는데 원류라고 할 수 있는 자바도 응원합니다.
Hacker News 의견
-
SecurityManager가 조용히 사라짐. 과거 Java 선택 과목을 가르치던 교수는 SecurityManager의 장점을 자주 강조했음. 당시에는 매우 회의적이었고, 지금은 그 회의가 옳았음을 증명받아 만족스러움
-
구조적 동시성의 미리보기를 끝내고 싶음. 이는 Java가 golang에 비해 동시성 프로그래밍의 용이성에서 마지막 격차를 줄이는 데 도움이 됨. Go는 채널과 대기 그룹을 쉽게 만듦. 구조적 동시성은 이러한 기본 요소를 사용하여 더 높은 수준의 작업을 쉽게 작성하고 이해할 수 있게 함
-
가상 스레드 고정이 없는 것이 큰 장점임. 이제 거의 제한 없이 가상 스레드를 사용할 수 있음
-
Streams가 여전히 사랑받고 있는 것을 보는 것이 좋음. 회사에서 fizzbuzz 스타일의 인터뷰를 많이 진행하는데, Java를 선택하고 스트림을 사용하는 사람들이 일반적으로 통과함. 이는 언어의 인체공학성과 직관성, 그리고 추상화의 힘을 보여줌. Java 스트림은 Ruby의 함수형 스타일 연산 체인만큼 강력하지만 실제로 성능이 좋음
-
새로운 기능: OpenJDK 24 프로젝트 링크
-
ARM32와 Risc-V 릴리스는 곧 여기에서 확인 가능함
-
Raspberry 2와 Vision Five 2는 Oracle과 OpenJDK가 무시하는 매우 미래 지향적인 하드웨어임
-
OpenJDK와 공식 Oracle JDK 릴리스 사용 간의 라이선스 차이에 대한 질문
-
JEP 491이 아직 언급되지 않은 것이 놀라움. 이는 "synchronized" 키워드가 가상 스레드를 망치지 않도록 보장함. 기존 코드를 가상 스레드에서 실행하는 데 큰 이점임
-
Java의 버전 성장은 지난 몇 년간 흥미로웠음. Java 9, 10, 11 LTS를 거쳐 여전히 Java 8을 사용 중임. 할 일이 너무 많음
-
최신 버전의 Java와 Kotlin을 비교할 때 Java는 계속 개선되고 Kotlin의 기능을 가져오고 있지만, Kotlin도 자체적으로 개선 중임
-
GraalVM도 Java 24에 사용할 수 있음. 많은 좋은 기능이 있음
-
가상 스레드에 대한 고정이 드디어 없어짐