JDK 15 : Java 15의 새로운 기능

Oracle의 Java SE (Standard Edition) 차기 버전 구현 인 Java Development Kit 15는 2020 년 9 월 15 일에 프로덕션 릴리스로 제공됩니다. JDK 15의 하이라이트에는 텍스트 블록, 숨겨진 클래스, 외부 메모리 액세스 API, Z 가비지 수집기, 봉인 된 클래스, 패턴 일치 및 레코드 미리보기

JDK 15는 단기 릴리스 일 뿐이며 내년 3 월 JDK 16이 출시 될 때까지 6 개월 동안 만 Oracle Premier Support를 통해 지원됩니다. Oracle이 8 년 동안 지원할 차기 장기 지원 릴리스 인 JDK 17은 Java SE 버전에 대한 Oracle의 6 개월 릴리스주기에 따라 지금부터 1 년 후에 출시 될 예정입니다.

개발자들은 이제 JDK 15를 살펴보고 JDK 17에 포함될 내용을 파악할 수 있다고 Oracle Java Platform Group의 사장 인 Georges Saab은 말했습니다. 현재 LTS 릴리스는 2018 년 9 월에 도착한 JDK 11입니다. LTS 릴리스는 3 년마다 도착합니다. JDK 15는 2020 년 3 월 17 일에 출시 된 JDK 14를 따릅니다. 

OpenJDK 15의 새로운 기능 및 변경 사항 :

  • Java 프로그램이 Java 힙 외부의 외부 메모리에 안전하고 효율적으로 액세스 할 수 있도록하는 외부 메모리 액세스 API의 두 번째 인큐베이터입니다. API는 네이티브, 영구 및 관리 힙과 같은 다양한 종류의 외부 메모리에서 작동 할 수 있어야합니다. 많은 Java 프로그램은 Ignite 및 MapDB와 같은 외부 메모리에 액세스합니다. API는 가비지 수집과 관련된 비용 및 예측 불가능 성을 방지하고, 프로세스간에 메모리를 공유하고, 파일을 메모리에 매핑하여 메모리 콘텐츠를 직렬화 및 역 직렬화하는 데 도움이됩니다. Java API는 현재 외부 메모리 액세스에 대한 만족스러운 솔루션을 제공하지 않습니다. 그러나 새로운 제안으로 인해 API가 JVM의 안전을 훼손하는 것은 불가능합니다. 이 기능은 JDK 14에서 초기 인큐베이터 단계를 거치며 JDK 15에서 제공됩니다. 
  • 봉인 된 수업 미리보기. 인터페이스와 함께 봉인 된 클래스는이를 확장하거나 구현할 수있는 다른 클래스 또는 인터페이스를 제한합니다. 이 기능의 목표는 클래스 또는 인터페이스 작성자가 코드 구현을 담당하는 코드를 제어 할 수 있도록 허용하고, 액세스 수정 자보다 더 선언적인 방법을 제공하여 수퍼 클래스 사용을 제한하고, 포괄적 인 기능을 뒷받침하여 패턴 일치의 향후 방향을 지원하는 것입니다. 패턴 분석.
  • 소스 코드 제거 및 Solaris / SPARC, Solaris / x64 및 Linux / SPARC 포트에 대한 빌드 지원. JDK 14에서 제거 할 예정이며 향후 릴리스에서 제거 할 예정입니다. Valhalla, Loom 및 Panama와 같은 개발중인 많은 프로젝트와 기능은 CPU 아키텍처 및 운영 체제 별 코드를 크게 변경해야합니다. Solaris 및 SPARC 포트에 대한 지원이 중단되면 OpenJDK 커뮤니티의 기여자가 플랫폼을 발전시킬 새로운 기능의 개발을 가속화 할 수 있습니다. Solaris와 SPARC는 최근 몇 년 동안 Linux OS 및 Intel 프로세서로 대체되었습니다.
  • 불변 데이터에 대한 투명한 운반자 역할을하는 클래스 인 레코드는 JDK 14에서 초기 미리보기로 데뷔 한 후 JDK 15의 두 번째 미리보기 버전에 포함될 것입니다. 계획의 목표에는 다음을 표현하는 객체 지향 구조를 고안하는 것이 포함됩니다. 단순한 값 집계, 프로그래머가 확장 가능한 동작이 아닌 변경 불가능한 데이터 모델링에 집중하도록 돕고, 동등 및 평가자와 같은 데이터 기반 메소드를 자동으로 구현하고, 명목 입력 및 마이그레이션 호환성과 같은 오랜 Java 원칙을 보존합니다. 레코드는 명목상 튜플이라고 생각할 수 있습니다. 
  • Edwards-Curve 디지털 서명 알고리즘 (EdDSA)을 기반으로하는 암호화 서명. EdDSA는 JDK의 기존 서명 체계에 비해 장점이있는 현대적인 타원 곡선 체계입니다. EdDSA는 SunEC 공급자에서만 구현됩니다. EdDSA는 다른 서명 체계에 비해 향상된 보안 및 성능 때문에 수요가 많습니다. OpenSSL 및 BoringSSL과 같은 암호화 라이브러리에서 이미 지원됩니다.
  • java.net.datagram.Socketjava.net.MulticastSocketAPI 의 기본 구현 을 1. 디버그 및 유지 관리가 용이하고 2. 현재 Project Loom에서 탐색중인 가상 스레드와 함께 작동하는 더 간단하고 현대적인 구현 으로 대체하여 레거시 DatagramSocket API를 다시 구현합니다  . 새로운 계획은 레거시 소켓 API를 다시 구현 한 JDK 향상 제안 353에 대한 후속 조치입니다. 현재의 구현 java.net.datagram.Socketjava.net.MulticastSocketJDK 1.0 날짜 다시 및 IPv6는 아직 개발했던 시간. 따라서 현재 구현은  MulticastSocket IPv4와 IPv6를 유지하기 어려운 방식으로 조정하려고합니다.
  • 기본적으로 편향된 잠금을 비활성화하고 모든 관련 명령 줄 옵션을 더 이상 사용하지 않습니다. 목표는 비 경합 잠금의 오버 헤드를 줄이기 위해 HotSpot 가상 머신에서 사용되는 바이어스 잠금의 유지 관리 비용이 많이 드는 레거시 동기화 최적화에 대한 지속적인 지원의 필요성을 결정하는 것입니다. 일부 Java 애플리케이션은 편향 잠금이 비활성화 된 상태에서 성능 저하를 볼 수 있지만 편향 잠금의 성능 향상은 일반적으로 예전보다 덜 분명합니다.
  • instanceofJDK 14의 이전 미리보기에 이어에 대한 패턴 일치의 두 번째 미리보기입니다 . 패턴 일치를 사용하면 프로그램의 공통 논리 (주로 개체에서 구성 요소의 조건부 추출)를보다 쉽고 간결하게 표현할 수 있습니다. Haskell 및 C #과 같은 언어는 간결성과 안전성을 위해 패턴 일치를 채택했습니다.
  • 숨겨진 클래스, 즉 다른 클래스의 바이트 코드에서 직접 사용할 수없는 클래스는 런타임에 클래스를 생성하고 리플렉션을 통해 간접적으로 사용하는 프레임 워크에서 사용하기위한 것입니다. 숨겨진 클래스는 액세스 제어 중첩의 구성원으로 정의 될 수 있으며 다른 클래스와 독립적으로 언로드 될 수 있습니다. 이 제안은 표준 API가 검색 할 수없고 수명주기가 제한된 숨겨진 클래스를 정의 할 수 있도록함으로써 JVM의 모든 언어의 효율성을 향상시킬 것입니다. JDK 내부 및 외부의 프레임 워크는 대신 숨겨진 클래스를 정의 할 수있는 클래스를 동적으로 생성 할 수 있습니다. JVM에 구축 된 많은 언어는 유연성과 효율성을 위해 동적 클래스 생성에 의존합니다. 이 제안의 목표는 다음과 같습니다 : 프레임 워크가 클래스를 프레임 워크의 발견 불가능한 구현 세부 사항으로 정의하도록 허용그래서 그것들은 다른 계급에 의해 연결되거나 반성을 통해 발견 될 수 없습니다. 검색 불가능한 클래스로 액세스 제어 중첩 확장 지원 검색 불가능한 클래스의 공격적인 언로드를 지원하므로 프레임 워크는 필요한만큼 정의 할 수있는 유연성을 갖습니다. 또 다른 목표는 비표준 API를 폐기하는 것입니다. misc.Unsafe::defineAnonymousClass, 향후 릴리스에서 제거를 위해 더 이상 사용되지 않습니다. 또한이 제안의 결과로 Java 언어가 변경되지 않습니다.
  • ZGC (Z Garbage Collector)는이 제안에 따라 실험 기능에서 제품으로 전환됩니다. 2018 년 9 월에 출시 된 JDK 11에 통합 된 ZGC는 확장 가능하고 지연 시간이 짧은 가비지 수집기입니다. ZGC는 Java 개발자가이 크기의 기능을 결정하고 복잡성을 신중하고 점진적으로 가져와야하기 때문에 실험적 기능으로 도입되었습니다. 그 이후로 동시 클래스 언로드, 사용되지 않은 메모리 커밋 해제, 클래스 데이터 공유 지원에서 향상된 NUMA 인식 및 다중 스레드 힙 사전 터치에 이르기까지 다양한 개선 사항이 추가되었습니다. 또한 최대 힙 크기가 4 테라 바이트에서 16 테라 바이트로 늘어났습니다. ZGC는 기계 학습과 같은 방대한 양의 데이터를 포함하는 애플리케이션의 성능 문제를 해결합니다.사용자가 데이터 처리가 가비지 수집으로 인해 예측 불가능하거나 긴 일시 중지되지 않도록하기를 원합니다. 지원되는 플랫폼에는 Linux, Windows 및 MacOS가 포함됩니다.
  • JDK 14 및 JDK 13에서 미리 볼 수있는 텍스트 블록은 일반적인 경우에 이스케이프 시퀀스를 피하면서 여러 줄의 소스 코드에 걸쳐있는 문자열을 쉽게 표현할 수 있도록하여 Java 프로그램 작성 작업을 단순화하기위한 것입니다. 텍스트 블록은 대부분의 이스케이프 시퀀스가 ​​필요하지 않고 예측 가능한 방식으로 문자열의 형식을 자동으로 지정하며 개발자가 원하는 경우 형식을 제어 할 수있는 여러 줄 문자열 리터럴입니다. 텍스트 블록 제안의 목표는 비 Java 언어로 작성된 코드를 나타내는 Java 프로그램에서 문자열의 가독성을 향상시키는 것입니다. 또 다른 목표는 모든 새 구문이 문자열 리터럴과 동일한 문자열 집합을 표현하고 동일한 이스케이프 시퀀스를 해석하고 문자열 리터럴과 동일한 방식으로 조작 될 수 있음을 규정하여 문자열 리터럴에서 마이그레이션을 지원하는 것입니다.OpenJDK 개발자는 명시 적 공백과 줄 바꿈 제어를 관리하기 위해 이스케이프 시퀀스를 추가하기를 희망합니다.
  • Shenandoah의 낮은 일시 중지 시간 가비지 수집기는 프로덕션 기능이되어 실험 단계에서 벗어납니다. 1 년 전에 JDK 12에 통합되었습니다.
  • 2014 년 3 월 JDK 8에서 데뷔했지만 이후 GraalVM과 같은 기술에 의해 쓸모 없게 된 Nashorn 제거. OpenJDK 15 제안은 Nashorn API를 제거하고 Nashorn을 호출하는 데 사용되는 jjs 명령 줄 도구를 요구합니다.
  • 향후 제거를 위해 RMI 활성화 메커니즘이 더 이상 사용되지 않습니다. RMI 활성화 메커니즘은 Java 8 이후 선택 사항이었던 RMI의 구식 부분입니다. RMI 활성화는 지속적인 유지 관리 부담을 부과합니다. RMI의 다른 부분은 더 이상 사용되지 않습니다.