자바 버전 역사

자바 언어는 JDK 1.0 이후로 여러 가지 변경 사항을 겪었을 뿐만 아니라 표준 라이브러리에 대한 수많은 클래스 및 패키지 추가를 거쳤다. J2SE 1.4 이후 Java 언어의 발전은 JSR(Java Specification Requests)을 사용하여 Java 플랫폼에 대한 추가 및 변경 사항을 제안하고 규정하는 JCP(Java Community Process)에 의해 관리되었다. 언어는 JLS(Java Language Specification)에 의해 규정된다. JLS에 대한 변경 사항은 JSR 901에 따라 관리된다. 2017년 9월 Java 플랫폼의 수석 아키텍트인 마크 레이놀드(Mark Reinhold)는 릴리스 트레인을 당시의 2년 일정이 아닌 "6개월마다 하나의 기능 릴리스"로 변경할 것을 제안했다. 이 제안은 이후의 모든 버전에 적용되었다. 언어 변경 외에도 JDK 1.0의 수백 개 클래스에서 J2SE 5의 3,000개 이상으로 성장한 수년에 걸쳐 Java 클래스 라이브러리에 다른 변경 사항이 적용되었다. Swing 및 Java2D와 같은 완전히 새로운 API가 도입되었으며 원래의 수많은 JDK 1.0 클래스 및 메서드는 현재 구식(deprecated)이다. 일부 프로그램은 Java 플랫폼의 한 버전에서 이전 버전으로 Java 프로그램을 변환할 수 있다. (예: Java 5.0이 1.4로 백포트됨) Oracle Java SE 지원 로드맵과 관련하여 버전 19는 최신 버전이며 버전 17, 11 및 8은 현재 지원되는 LTS(장기 지원) 버전이며 오라클 프리미어 서포트(Oracle Premier Support)를 받게 된다. Java 8 LTS 상업용 마지막 무료 소프트웨어 공개 업데이트는 Oracle에서 2022년 3월에 출시했으며 Oracle은 계속해서 개발 및 개인용 무료 공개 Java 8 업데이트를 지속적으로 출시하고 있다. Java 7은 더 이상 공개적으로 지원되지 않는다. Java 11의 경우 Oracle은 대중을 위해 장기 지원을 제공하지 않는다. 대신 Eclipse Adoptium 등과 같은 광범위한 OpenJDK 커뮤니티가 작업을 수행할 것으로 예상된다. Java 17 최신(3차) LTS가 2021년 9월 14일에 릴리스되었다. Java 19 일반 가용성(General Availability, GA)은 2022년 9월 20일에 시작되었다. 최신(제4차) LTS인 자바 21은 2023년 9월 19일에 출시되었다. 첫 번째 버전은 1996년 1월 23일에 출시되었다. 첫 번째 안정 버전인 JDK 1.0.2는 Java 1이라고 한다. 1997년 2월 19일 릴리스의 주요 추가 사항은 다음과 같다. AWT 이벤트 모델의 광범위한 재정비 언어에 추가된 내부 클래스 자바빈즈 JDBC RMI 및 직렬화 Introspection만 지원하는 리플렉션으로 런타임에 수정이 불가능했다. (객체를 반사적으로 수정하는 기능은 J2SE 1.2에서 AccessibleObject 클래스와 Field 클래스와 같은 하위 클래스를 도입하여 추가되었다.) Symantec에서 JavaSoft용으로 제작한 Microsoft Windows 플랫폼의 JIT(Just In Time) 컴파일러 Taligent에서 시작된 국제화 및 유니코드 지원 1998년 12월 8일의 릴리스와 J2SE 5.0을 통한 후속 릴리스는 소급하여 Java 2로 이름이 변경되었으며 버전 이름 "J2SE"(Java 2 Platform, Standard Edition)는 기본 플랫폼을 J2EE(Java 2 Platform, Enterprise Edition)와 구별하기 위해 JDK를 대체했다. 및 J2ME(Java 2 Platform, Micro Edition). 이것은 Java 플랫폼의 크기를 59개 패키지의 1520개 클래스로 세 배로 늘린 매우 중요한 Java 릴리스였다. 주요 추가 사항: strictfp 키워드(JVM 17에 의해 사용되지 않는 키워드, 새 코드에서 사용하면 안 됨) Swing 그래픽 API가 핵심 클래스에 통합되었다. Sun의 JVM에 처음으로 JIT 컴파일러 탑재 자바 플러그인 CORBA 상호 운용성을 위한 IDL 구현체인 Java IDL 컬렉션 프레임워크 2000년 5월 8일 릴리스에서 가장 주목할 만한 변경 사항은 다음과 같다. HotSpot JVM 포함(HotSpot JVM은 J2SE 1.2 JVM용으로 1999년 4월에 처음 출시됨) CORBA와의 선택적 호환성을 지원하도록 RMI가 수정되었다. 코어 라이브러리에 포함된 JNDI(Java Naming and Directory Interface)(이전에는 확장으로 사용 가능) 자바 플랫폼 디버거 아키텍처(JPDA) 자바사운드 합성 프록시 클래스 Java 1.3은 Microsoft Windows 95를 공식적으로 지원하는 마지막 Java 릴리스이다. 2002년 2월 6일 릴리스는 Java Community Process에서 JSR 59로 개발된 Java 플랫폼의 첫 번째 릴리스였다. 주요 변경 사항은 다음과 같다. 언어 변경 assert 키워드(JSR 41에 지정됨) 라이브러리 개선 Perl 정규식을 모델로 한 정규식 예외 체인은 예외가 원래 하위 수준 예외를 캡슐화하도록 허용한다. 인터넷 프로토콜 버전 6(IPv6) 지원 비차단 I/O(NIO라고 함)(JSR 51에 지정됨) 로깅 API(JSR 47에 지정됨) JPEG 및 PNG와 같은 형식으로 이미지를 읽고 쓰기 위한 이미지 I/O API 통합 XML 파서 및 XSLT 프로세서(JAXP)(JSR 5 및 JSR 63에 지정됨) 통합 보안 및 암호화 확장(JCE, JSSE, JAAS) Java Web Start 포함(Java Web Start는 J2SE 1.3용으로 2001년 3월에 처음 출시됨)(JSR 56에 지정됨) 기본 설정 API(java.util.prefs) Java 1.4에 대한 공개 지원 및 보안 업데이트는 2008년 10월에 종료되었다. Oracle 고객을 위한 유료 보안 업데이트는 2013년 2월에 종료되었다. 2004년 9월 30일의 릴리스는 원래 번호가 1.5였으며 여전히 내부 버전 번호로 사용된다. 숫자는 "J2SE의 성숙도, 안정성, 확장성 및 보안 수준을 더 잘 반영"하도록 변경되었다. 이 버전은 JSR 176에 따라 개발되었다. Java SE 5는 2008년 4월 8일에 공개 업데이트 종료 기간에 들어갔다. 업데이트는 2009년 11월 3일부로 더 이상 공개되지 않는다. 업데이트는 2015년 5월까지 유료 Oracle 고객에게 제공되었다. 자바 SE 5의 코드명 타이거(Tiger)는 몇 가지 중요한 새 언어 기능을 추가했다. 제네릭: 컬렉션에 대한 컴파일 타임(정적) 자료형 안전성을 제공하고 대부분의 자료형 변환에 대한 필요성을 제거한다. (JSR 14에 의해 규정됨) 메타데이터: 주석(annotation)이라고도 한다. 클래스 및 메서드와 같은 언어 구조에 추가 데이터로 태그를 지정할 수 있으며, 그런 다음 메타데이터 인식 유틸리티(JSR 175에서 규정)로 처리할 수 있다. Autoboxing/unboxing: 기본 유형(예: int)과 기본 래퍼 클래스(예: Integer) 간의 자동 변환(JSR 201에 의해 규정됨) 열거형: enum 키워드는 형식이 안전하고 정렬된 값 목록(예: Day.MONDAY, Day.TUESDAY 등)을 만든다. 이전에는 유형이 안전하지 않은 상수 정수 또는 수동으로 생성된 클래스(유형이 안전한 열거형 패턴)(JSR 201에 의해 지정됨)에 의해서만 이를 달성할 수 있었다. Varargs: 메소드의 마지막 매개변수는 이제 유형 이름 뒤에 세 개의 점을 사용하여 선언할 수 있다. (예: void drawtext(String... lines)) 호출 코드에서 해당 유형의 매개 변수를 얼마든지 사용할 수 있으며 그런 다음 메서드에 전달할 배열에 배치하거나 호출 코드가 해당 유형의 배열을 전달할 수 있다. 각 루프에 대해 향상됨: for 루프 구문은 표준 Collection 클래스(JSR 201에서 지정)와 같이 배열 또는 Iterable의 각 구성원을 반복하기 위한 특수 구문으로 확장된다. 다중 스레드 Java 프로그램의 실행 시맨틱이 향상되었다. 새로운 Java 메모리 모델은 이전 사양의 복잡성, 효율성 및 성능 문제를 해결한다. 정적 임포트 또한 표준 라이브러리에 다음과 같은 개선 사항이 있다. RMI 객체에 대한 자동 스텁 생성 Swing: 신디사이저라고 하는 새로운 스킨 가능 모양과 느낌 패키지 java.util.concurrent의 동시성 유틸리티 다양한 입력 스트림 및 버퍼에서 데이터를 구문 분석하기 위한 스캐너 클래스 Java 5는 Microsoft Windows 98 및 Windows ME를 공식적으로 지원하는 Java의 마지막 릴리스이며, Windows Vista는 Java 5가 2009년 10월에 단종되기 전에 Java SE 5가 지원되는 최신 Windows 버전이었다. Java 5 업데이트 5(1.5.0_05)는 Windows 95(Internet Explorer 5.5 설치) 및 Windows NT 4.0에서 작동하는 마지막 Java 릴리스이다. Java 5는 Apple Mac OS X 10.4(Tiger)에서 처음 사용할 수 있었고 Apple Mac OS X 10.5(Leopard)에 설치된 기본 Java 버전이었다. Java 1.5에 대한 공개 지원 및 보안 업데이트는 2009년 11월에 종료되었다. Oracle 고객을 위한 유료 보안 업데이트는 2015년 4월에 종료되었다. 2006년 12월 11일에 릴리스된 버전에서 Sun은 "J2SE"라는 이름을 Java SE로 바꾸고 버전 번호에서 ".0"을 삭제했다. 개발자를 위한 내부 번호 지정은 1.6.0으로 유지된다. 이 버전은 JSR 270에서 개발되었다. 개발 단계에서 개선 사항 및 버그 수정을 포함한 새로운 빌드가 거의 매주 릴리스되었다. 베타 버전은 2006년 2월과 6월에 출시되어 2006년 12월 11일에 최종 출시되었다. 이 버전에 포함된 주요 변경 사항: 이전 Win9x 버전에 대한 지원이 중단되었다. 비공식적으로 Java 6 Update 7은 이러한 버전의 Windows에서 작동하는 것으로 나타난 Java의 마지막 릴리스였다. 이것은 업데이트 10의 주요 변경 사항 때문이라고 간주된다. 스크립팅 언어 지원(JSR 223): 스크립팅 언어 및 기본 제공 Mozilla JavaScript Rhino 통합과의 긴밀한 통합을 위한 일반 API이다. 핵심 플랫폼 및 Swing의 극적인 성능 향상. JAX-WS(JSR 224)를 통해 향상된 웹 서비스 지원. JDBC 4.0 지원(JSR 221). Java 컴파일러 API(JSR 199): Java 프로그램이 프로그래밍 방식으로 Java 컴파일러를 선택하고 호출할 수 있도록 하는 API이다. JAXB를 버전 2.0으로 업그레이드: StAX 파서의 통합을 포함한다. 플러그형 주석 지원(JSR 269). API에 SwingWorker 통합, 테이블 정렬 및 필터링, 진정한 Swing 이중 버퍼링(회색 영역 효과 제거)과 같은 많은 GUI 개선 사항이 있다. JVM 개선 사항에는 동기화 및 컴파일러 성능 최적화, 새로운 알고리즘 및 기존 가비지 수집 알고리즘에 대한 업그레이드, 애플리케이션 시작 성능이 포함된다. Java 6은 64비트(Core 2 Duo 이상) 프로세서 시스템에서 실행되는 Mac OS X 10.5(Leopard)에 설치할 수 있다. Java 6은 Mac OS X 10.6(Snow Leopard)을 실행하는 32비트 및 64비트 시스템에서도 모두 지원된다. Java 6은 2013년 2월에 지원 수명이 종료되었으며 이때 보안 업데이트를 포함한 모든 공개 업데이트가 중지될 예정이었다. Oracle은 2013년 3월과 4월에 Java 6에 대한 두 가지 업데이트를 추가로 발표하여 일부 보안 취약점을 패치했다. Java 6 릴리스 이후 Sun 및 이후 Oracle은 공용 API를 변경하지 않으면서 최종 사용자 사용성을 향상시키거나 버그를 수정하는 몇 가지 업데이트를 릴리스했다. Java 7은 2011년 7월 7일에 시작되어 2011년 7월 28일에 개발자가 사용할 수 있게 된 주요 업데이트이다. 개발 기간은 13개의 이정표로 구성되었다. 2011년 6월 6일에 13개의 이정표 중 마지막 이정표가 완료되었다. 평균적으로 마일스톤당 8개의 빌드(일반적으로 개선 사항 및 버그 수정 포함)가 릴리스되었다. OpenJDK 7 프로젝트의 기능 목록에는 많은 변경 사항이 나열되어 있다. Java 7의 추가 사항은 다음과 같다. 현재 다국어 가상 머신에서 수행되는 프로토타이핑 작업에 이어 JSR-292의 새로운 invokedynamic 바이트코드를 사용하여 동적 언어에 대한 JVM 지원 압축된 64비트 포인터(-XX:+UseCompressedOops가 있는 Java 6에서 사용 가능) 사소한 언어 변경 사항(Coin이라는 프로젝트로 그룹화됨): switch 내 문자열 try-with-resources 문이라고도 하는 try-statement의 자동 리소스 관리 일반 인스턴스 생성을 위한 향상된 유형 추론(다이아몬드 연산자 <>) 간소화된 varargs 메서드 선언 이진 정수 리터럴 숫자 리터럴에서 밑줄 허용 향상된 유형 검사를 통해 여러 예외 유형 포착 및 예외 다시 발생 JSR 166에 따른 동시성 유틸리티 새로운 파일 I/O 라이브러리(JSR 203에서 정의)는 여러 파일 시스템, 파일 메타데이터 및 심볼릭 링크에 대한 지원을 추가한다. 새로운 패키지는 java.nio.file, java.nio.file.attribute 및 java.nio.file.spi이다. Timsort는 병합 정렬 대신 객체의 컬렉션 및 배열을 정렬하는 데 사용된다. 타원 곡선 암호화 알고리즘에 대한 라이브러리 수준 지원 최신 GPU에 특정한 기능 처리를 개선하는 Java 2D용 XRender 파이프라인 버전 6u10에서 지원되지 않는 API로 원래 구현된 그래픽 기능을 위한 새로운 플랫폼 API SCTP 및 소켓 다이렉트 프로토콜을 포함한 새로운 네트워크 프로토콜에 대한 향상된 라이브러리 수준 지원 XML 및 유니코드에 대한 업스트림 업데이트 Java 배포 규칙 세트 Lambda(Java의 람다 함수 구현), Jigsaw(Java의 모듈 구현) 및 Coin의 일부는 Java 7에서 제외되었으며 Java 8의 일부로 릴리스되다.(Jigsaw는 Java 9에서 릴리스됨) Java 7은 2012년 4월부터 Java 8이 출시될 때까지 java.com에서 다운로드하는 기본 버전이었다. Oracle은 제품의 공개 가용성이 종료되는 2015년 4월까지 분기별로 Java 7 제품군에 대한 공개 업데이트를 발표했다. 2022년 7월까지 계속되는 JDK 7의 추가 업데이트는 지원 계약이 있는 고객에게만 제공된다. Java 8은 2014년 3월 18일에 릴리스되었으며 Java 7용으로 계획되었지만 나중에 연기된 일부 기능이 포함되었다. 기능에 대한 작업은 JEP(JDK Enhancement Proposals) 측면에서 구성되었다. JSR 335, JEP 126: Project Lambda 및 기존 구현체를 손상시키지 않고 인터페이스에 메서드를 추가하는 데 사용할 수 있는 기본 메서드(가상 확장 메서드)에서 람다 식(공식적으로는 람다 식, 비공식적으로는 클로저)에 대한 언어 수준 지원. 람다 식에 대한 지원을 추가할지 여부에 대해 Java 커뮤니티에서 지속적인 논쟁이 있었다. Sun은 나중에 람다 표현식이 Java에 포함될 것이라고 선언하고 기능을 개선하기 위해 커뮤니티 의견을 요청했다. 람다 식을 지원하면 컬렉션에 대한 MapReduce에서 영감을 받은 변환과 같은 요소 스트림에 대한 기능 스타일 작업도 가능하다. API 작성자는 기본 메서드를 사용하여 이전 코드를 손상시키지 않고 인터페이스에 새 메서드를 추가할 수 있다. 주요 의도는 아니었지만 기본 메서드는 동작의 다중 상속(상태는 아님)에도 사용할 수 있다. JEP 174: 애플리케이션 내에 내장된 JavaScript 코드를 실행할 수 있는 JavaScript 런타임인 Project Nashorn JEP 104: Java 유형에 대한 주석 부호 없는 정수 산술 JEP 120: 주석 반복 JEP 150: 날짜 및 시간 API JEP 178: 정적으로 연결된 JNI 라이브러리 JEP 153: JavaFX 애플리케이션 실행(JavaFX 애플리케이션 JAR 직접 실행) JEP 122: 영구 생성 제거 Java 8은 Windows XP에서 지원되지 않지만 JDK 8 업데이트 25부터는 Windows XP에서 계속 설치 및 실행할 수 있다. JDK 8의 이전 업데이트는 보관된 zip 형식 파일을 다운로드하고 실행 파일에 대한 압축을 풀어 XP에서 실행할 수 있다. XP에서 실행할 수 있는 Java 8의 마지막 버전은 업데이트 251이다. 그러나 구성 요소 호환성은 초기 빌드에서 지원되지 않는 OS에서 중단되기 시작한다. Java 8 업데이트는 계속 개발 중이다. 2014년 10월부터 Java 8은 공식 웹 사이트에서 다운로드할 수 있는 기본 버전이었다.(Java 9를 대체하는 다운로드) 오라클은 개인 사용자를 위해 무기한으로 Java SE 8의 공개 업데이트 및 자동 업데이트를 계속 제공할 예정이다. Java SE 9는 2017년 9월 21일에 사용할 수 있게 되었다. Java Executive Committee가 Project Jigsaw의 현재 구현체에 대한 논란의 여지가 있는 수용으로 인해 Oracle이 몇 가지 미결 문제 및 우려 사항을 수정하고 몇 가지 중요한 기술 질문을 수정하게 되었다. 2017년 6월 마지막 날 Java Community Process는 제안된 모듈 시스템 체계에 대해 거의 만장일치로 동의했다. JSR 376: Project Jigsaw에서 JDK 모듈화(Java 플랫폼 모듈 시스템) JDK에서 JavaDB가 제거되었다. JEP 193: 변수 핸들, 다양한 java.util.concurrent.atomic 및 sun.misc.Unsafe 작업을 호출하는 표준 수단 정의 JEP 213: 밀링 프로젝트 코인, 개인 인스턴스 메서드에서 @SafeVarargs 허용; try-with-resources 문에서 효과적으로 최종 변수를 리소스로 사용할 수 있다. 유추된 유형의 인수 유형이 표시 가능한 경우 익명 클래스에 다이아몬드를 허용한다. Java SE 8에서 시작된 법적 식별자 이름 집합에서 밑줄 제거를 완료한다. 인터페이스의 전용 메서드 지원 JEP 222: jshell: Java Shell(Read-Eval-Print Loop): JShell은 Java 언어용 REPL 명령줄 인터페이스이다. JEP 254: 압축 문자열 JEP 263: HiDPI 그래픽: 자동 크기 조정 및 크기 조정 JEP 266: 더 많은 동시성 업데이트, 이전에 Reactive Streams에서 제공한 인터페이스를 포함하는 새로운 Flow 클래스를 포함하여 Reactive Streams의 Java 구현체를 포함한다. JEP 268: XML 카탈로그 JEP 282: jlink: Java 링커는 모듈 집합과 해당 종속성을 사용자 지정 런타임 이미지로 어셈블하고 최적화할 수 있는 도구를 만든다. JVM을 포함하여 완전히 사용 가능한 실행 파일을 효과적으로 생성하여 실행할 수 있다. JEP 295: Ahead-of-Time Compilation, GraalVM에서 제공하는 Ahead-of-Time 컴파일 첫 번째 Java 9 릴리스 후보는 2017년 8월 9일에 릴리스되었다. Java 9의 첫 번째 안정적인 릴리스는 2017년 9월 21일에 릴리스되었다. JavaOne 2011에서 Oracle은 2016년에 Java 9용으로 출시할 기능에 대해 논의했다. Java 9에는 멀티 기가바이트 힙에 대한 더 나은 지원, 더 나은 네이티브 코드 통합, 다른 기본 가비지 콜렉터(G1, "짧은 응답 시간") 및 자체 조정 JVM. 2016년 초에 Java 9의 출시 일정이 2017년 3월로 재조정되었으며 나중에 2017년 7월로 4개월 더 연기되었다. OpenJDK 10은 2018년 3월 20일에 릴리스되었으며 12개의 새로운 기능이 확인되었다. 이러한 기능은 다음과 같다. JEP 286: 로컬 변수 유형 유추 JEP 296: JDK 포리스트를 단일 리포지토리로 통합 JEP 304: 가비지 컬렉터 인터페이스 JEP 307: G1용 병렬 전체 GC JEP 310: 애플리케이션 클래스 데이터 공유 JEP 312: 스레드 로컬 핸드셰이크 JEP 313: 기본 헤더 생성 도구(javah) 제거 JEP 314: 추가 유니코드 언어 태그 확장 JEP 316: 대체 메모리 장치의 힙 할당 JEP 317: 실험적 Java 기반 JIT 컴파일러 JEP 319: 루트 인증서 JEP 322: 시간 기반 릴리스 버전 관리 JDK 11은 2018년 9월 25일에 릴리스되었으며 현재 버그 수정을 위해 버전이 열려 있다. LTS 또는 장기 지원을 제공한다. 그 중에서도 Java 11에는 다음과 같은 여러 가지 새로운 기능이 포함되어 있다. JEP 181: 중첩 기반 액세스 제어 JEP 309: 동적 클래스 파일 상수 JEP 315: Aarch64 내장 함수 개선 JEP 318: Epsilon: 무작동 가비지 컬렉터 JEP 320: Java EE 및 CORBA 모듈 제거 JEP 321: HTTP 클라이언트(표준) JEP 323: Lambda 매개변수에 대한 로컬 변수 구문 JEP 324: Curve25519 및 Curve448과의 주요 계약 JEP 327: 유니코드 10 JEP 328: 비행 기록 장치 JEP 329: ChaCha20 및 Poly1305 암호화 알고리즘 JEP 330: 단일 파일 소스 코드 프로그램 실행 JEP 331: 낮은 오버헤드 힙 프로파일링 JEP 332: TLS(전송 계층 보안) 1.3 JEP 333: ZGC: 확장 가능한 저지연 가비지 컬렉터(실험용) JEP 335: Nashorn JavaScript 엔진 사용 중단 JEP 336: Pack200 도구 및 API 사용 중단 이전 릴리스의 여러 기능이 삭제되었다. 특히 Java 애플릿과 Java Web Start는 더 이상 사용할 수 없다. JavaFX, Java EE 및 CORBA 모듈이 JDK에서 제거되었다. JDK 12는 2019년 3월 19일에 릴리스되었다. 그 중에서도 Java 12에는 다음과 같은 여러 가지 새로운 기능이 포함되어 있다. JEP 189: Shenandoah: 중단 시간이 짧은 가비지 컬렉터(실험적) JEP 230: 마이크로벤치마크 제품군 JEP 325: 스위치 표현식(프리뷰) JEP 334: JVM 상수 API JEP 340: 2개가 아닌 1개의 AArch64 포트 JEP 341: 기본 CDS 아카이브 JEP 344: G1용 중단 가능한 혼합 컬렉션 JEP 346: G1에서 사용하지 않은 커밋된 메모리를 즉시 반환 프리뷰 기능 JEP 325는 switch 문을 확장하여 표현식으로도 사용할 수 있도록 하고 오른쪽이 표현식인 새로운 형태의 case 레이블을 추가한다. break 문이 필요하지 않는다. 복잡한 표현식의 경우 yield 문을 사용할 수 있다. 이는 Java SE 14에서 표준이 된다. JDK 13은 2019년 9월 17일에 릴리스되었다. Java 13에는 다음과 같은 새로운 기능과 "수백 개의 작은 개선 사항 및 수천 개의 버그 수정"이 포함되어 있다. JEP 350: 동적 CDS 아카이브 JEP 351: ZGC: 사용되지 않은 메모리 커밋 해제 JEP 353: 레거시 소켓 API 재구현 JEP 354: 스위치 식(프리뷰) JEP 355: 텍스트 블록(프리뷰) JEP 355 텍스트 블록은 여러 줄 문자열 리터럴을 허용한다. String html = """ <html lang="en"> <body> <p>Hello, world</p> </body> </html> """; JDK 14는 2020년 3월 17일에 릴리스되었다. Java 14에는 다음과 같은 새로운 기능과 "수백 개의 작은 개선 사항 및 수천 개의 버그 수정"이 포함되어 있다. JEP 305: instanceof에 대한 패턴 일치(프리뷰) JEP 343: 패키징 도구(인큐베이터) JEP 345: G1에 대한 NUMA 인식 메모리 할당 JEP 349: JFR 이벤트 스트리밍 JEP 352: 비휘발성 매핑 바이트 버퍼 JEP 358: 유용한 NullPointerExceptions JEP 359: 레코드(프리뷰) JEP 361: 스위치 식(표준) JEP 362: Solaris 및 SPARC 포트 사용 중단 JEP 363: CMS(동시 마크 스윕) 가비지 컬렉터 제거 JEP 364: macOS의 ZGC JEP 365: Windows의 ZGC JEP 366: ParallelScavenge + SerialOld GC 조합 사용 중단 JEP 367: Pack200 도구 및 API 제거 JEP 368: 텍스트 블록(두 번째 프리뷰) JEP 370: 외부 메모리 액세스 API(인큐베이터) JDK 15는 2020년 9월 15일에 릴리스되었다. Java 15는 다음을 추가한다. 여러 줄 문자열 리터럴(일명 텍스트 블록)을 지원한다. Shenandoah 및 Z 가비지 컬렉터(후자는 ZGC로 축약되기도 함)가 이제 프로덕션에서 사용할 준비가 되었다.(즉, 더 이상 실험용으로 표시되지 않음) Oracle의 Solaris 운영 체제(및 SPARC CPU)에 대한 지원이 중단되었다.(예: Java 11에서는 계속 사용 가능) Nashorn JavaScript 엔진이 제거되었다. 일부 루트 CA 인증서도 제거했다. JEP 339: EdDSA(Edwards-Curve 디지털 서명 알고리즘) JEP 360: 봉인된 클래스(프리뷰) JEP 371: 히든 클래스 JEP 372: Nashorn JavaScript 엔진 제거 JEP 373: 레거시 DatagramSocket API 재구현 JEP 374: 편향된 잠금 비활성화 및 폐기 JEP 375: instanceof에 대한 패턴 일치(두 번째 프리뷰) JEP 377: ZGC: 확장 가능한 저지연 가비지 컬렉터 JEP 378: 텍스트 블록 JEP 379: Shenandoah: 중단 시간이 짧은 가비지 컬렉터 JEP 381: Solaris 및 SPARC 포트 제거 JEP 383: 외부 메모리 액세스 API(두 번째 인큐베이터) JEP 384: 레코드(두 번째 프리뷰) JEP 385: 제거를 위한 RMI 활성화 사용 중단 JDK 16은 2021년 3월 16일에 릴리스되었다. Java 16은 Ahead-of-Time 컴파일(및 Graal JIT) 옵션을 제거한다. Java 구현 자체는 여전히 C++로 작성되었으며 Java 16부터 최신 C++14(예: C++17 또는 C++20은 아님)가 허용된다. 코드도 GitHub로 이관하여 소스 제어 시스템에서 Mercurial을 삭제했다. JEP 338: 벡터 API(인큐베이터) JEP 347: C++14 언어 기능 활성화 JEP 357: Mercurial에서 Git으로 마이그레이션 JEP 369: GitHub로 마이그레이션 JEP 376: ZGC: 동시 스레드 스택 처리 JEP 380: Unix 도메인 소켓 채널 JEP 386: Alpine Linux 포트 – 아직 안정되지 않음 JEP 387: 탄력적 메타스페이스 JEP 388: Windows/AArch64 포트 JEP 389: 외부 링커 API(인큐베이터) JEP 390: 값 기반 클래스에 대한 경고 JEP 392: 패키징 도구 JEP 393: 외부 메모리 액세스 API(세 번째 인큐베이터) JEP 394: instanceof에 대한 패턴 일치 JEP 395: 레코드 JEP 396: 기본적으로 JDK 내부를 강력하게 캡슐화 JEP 397: 봉인된 클래스(두 번째 프리뷰) JDK 17은 2021년 9월 이후 현재 LTS(장기 지원) 릴리스이다. Java 17은 새로운 6개월 릴리스 주기(첫 번째는 Java 11)로 전환한 이후 두 번째 장기 지원(LTS) 릴리스이다. JEP 306: 항상 엄격한 부동 소수점 의미 체계 복원 JEP 356: 향상된 의사 난수 생성기 JEP 382: 새로운 macOS 렌더링 파이프라인 JEP 391: macOS/AArch64 포트 JEP 398: 제거를 위한 Applet API 사용 중단 JEP 403: JDK 내부를 강력하게 캡슐화 JEP 406: 스위치용 패턴 일치(프리뷰) JEP 407: RMI 활성화 제거 JEP 409: 봉인된 클래스 JEP 410: 실험용 AOT 및 JIT 컴파일러 제거 JEP 411: 제거를 위해 보안 관리자 사용 중단 JEP 412: 외부 함수 및 메모리 API(인큐베이터) JEP 414: 벡터 API(두 번째 인큐베이터) JEP 415: 컨텍스트별 역직렬화 필터 JEP 406은 instanceof 작업에 사용되는 패턴 일치 구문을 확장하여 명령문과 표현식을 전환한다. 인수 유형, null 사례 및 정제 패턴에 따라 케이스를 선택할 수 있다. JDK 18은 2022년 3월 22일에 릴리스되었다. JEP 400: 기본적으로 UTF-8 JEP 408: 단순 웹 서버 JEP 413: Java API 설명서의 코드 스니펫 JEP 416: 메소드 핸들로 코어 리플렉션 재구현 JEP 417: 벡터 API(3차 인큐베이터) JEP 418: 인터넷 주소 확인 SPI JEP 419: 외부 기능 및 메모리 API(두 번째 인큐베이터) JEP 420: 스위치용 패턴 매칭(두 번째 프리뷰) JEP 421: 제거를 위한 마무리 사용 중단 JDK 19는 2022년 9월 20일에 릴리스되었다. JEP 405: 레코드 패턴(프리뷰) JEP 422: Linux/RISC-V 포트 JEP 424: 외부 함수 및 메모리 API(프리뷰) JEP 425: 가상 스레드(프리뷰) JEP 426: 벡터 API(4차 인큐베이터) JEP 427: 스위치에 대한 패턴 일치(세 번째 프리뷰) JEP 428: 구조화된 동시성(인큐베이터) Jep 405는 레코드 패턴을 허용하여 instanceof 연산자의 패턴 일치 기능을 확장하고 표현식을 전환하여 레코드의 구성 요소를 명시적으로 참조하는 레코드 패턴을 포함한다. Java 20은 2023년 3월에 출시되었다. JEP 429: 범위 값(인큐베이터) JEP 432: 기록 패턴(두 번째 프리뷰) JEP 433: 스위치용 패턴 매칭(네 번째 프리뷰) JEP 434: 외부 함수 및 메모리 API(두 번째 프리뷰) JEP 436: 가상 스레드(두 번째 프리뷰) JEP 437: 구조화된 동시성(두 번째 인큐베이터) JEP 438: 벡터 API (다섯 번째 인큐베이터) Java 21은 2023년 9월 19일에 출시되었다. 프리뷰 및 인큐베이팅 JEP만 있는 Java 20과 비교하면 미리 보기 또는 인큐베이팅 상태가 아닌 8개의 JEP가 있다. Java 21에는 Java 17(스위치 문에 대한 패턴 일치) 및 Java 19(레코드 패턴)에서 처음으로 미리 본 기능이 도입되었다. x86 기반 윈도우 32비트 버전은 제거를 위해 구식화되었다. JEP 430: String Templates (Preview) JEP 431: Sequenced Collections JEP 439: Generational ZGC JEP 440: Record Patterns JEP 441: Pattern Matching for switch JEP 442: Foreign Function & Memory API (Third Preview) JEP 443: Unnamed Patterns and Variables (Preview) JEP 444: Virtual Threads JEP 445: Unnamed Classes and Instance Main Methods (Preview) JEP 446: Scoped Values (Preview) JEP 448: Vector API (Sixth Incubator) JEP 449: Deprecate the Windows 32-bit x86 Port for Removal JEP 451: Prepare to Disallow the Dynamic Loading of Agents JEP 452: Key Encapsulation Mechanism API JEP 453: Structured Concurrency (Preview) 2023년 6월 기준으로 자바 22의 사양은 아직 확정되지 않았다. 자바 22는 2024년 3월 출시될 예정이다. 공식적으로 지원되는 Java 플랫폼은 Sun에서 처음 개발되어 현재 Oracle에서 관리하고 있는 Java SE이다. 릴리스는 개방형 개발 모델을 사용하는 무료 오픈 소스 프로젝트인 OpenJDK 프로젝트를 기반으로 한다. 그러나 부분적으로 독점 소프트웨어로서의 Java의 초기 역사로 인해 다른 Java 구현체가 존재한다. 대조적으로 일부 구현체는 표준 구현체보다 약간의 이점을 제공하기 위해 만들어졌으며 종종 일부 학술 또는 기업 후원 연구의 결과이다. 많은 Linux 배포판에는 Red Hat이 시작한 IcedTea 프로젝트를 통한 OpenJDK 빌드가 포함되어 있어 보다 간단한 빌드 및 통합 환경을 제공한다. Visual J++ 및 Microsoft Java Virtual Machine은 호환되지 않는 구현체로 생성되었다. Sun v. Microsoft 소송 후 Microsoft는 이를 포기하고 .NET 플랫폼 작업을 시작했다. 2021년에 Microsoft는 먼저 Java 11용 호환 "Microsoft Build of OpenJDK" 배포를 시작한 다음 Java 17용 배포를 시작했다. 해당 빌드는 Windows뿐만 아니라 Linux 및 macOS도 지원한다. Azul의 Zing과 같은 다른 독점 Java 구현체를 사용할 수 있다. Azul은 Zulu라는 이름으로 인증된 오픈 소스 OpenJDK 빌드를 제공한다. OpenJDK가 출시되기 전에는 Sun의 구현체가 여전히 독점적이었지만 GNU Classpath 프로젝트는 Java 플랫폼의 무료 오픈 소스 구현체를 제공하기 위해 만들어졌다. OpenJDK가 공식 참조 구현체가 된 JDK 7 릴리스 이후 GNU Classpath 프로젝트의 원래 동기는 거의 완전히 사라졌고 마지막 릴리스는 2012년이었다. Apache Harmony 프로젝트는 OpenJDK 출시 직전에 시작되었다. Sun의 초기 소스 코드 릴리스 이후 Harmony 프로젝트는 OpenJDK용으로 선택된 보호 라이선스와 달리 느슨한 라이선스로 구현체를 제공하기 위해 계속 노력했다. 구글은 나중에 안드로이드를 개발하여 느슨한 라이선스로 출시했다. Android는 Harmony 프로젝트의 일부를 Google 자체의 Dalvik 가상 머신 및 ART로 보완했다. 이후 Apache Harmony는 사용 중지되었으며 Google은 Harmony 구성 요소를 OpenJDK의 동등한 구성 요소로 전환했다. Jikes와 Jikes RVM은 모두 IBM이 개발한 오픈 소스 연구 프로젝트이다. 독점 소프트웨어로 시작했지만 지금은 오픈 소스인 몇 가지 다른 구현체가 존재한다. IBM은 처음에 OpenJ9을 독점 J9로 개발했지만 이후 프로젝트 라이선스를 다시 부여하고 이클립스 재단에 기부했다. JRockit은 Oracle에서 인수하여 후속 OpenJDK 버전에 통합된 독점 구현체이다. “JDK 17”. 《openjdk.java.net》. 2021년 9월 17일에 확인함.  “Chapter 4. The class File Format”.  “Oracle Java SE Support Roadmap”. 《www.oracle.com》.  “Support | AdoptOpenJDK”. 《adoptopenjdk.net》.  “Amazon Corretto 8 & 11 support extended”.  “Azul Support Roadmap”. 《Azul | Better Java Performance, Superior Java Support》 (미국 영어). 2021년 7월 8일에 확인함.  “OpenJDK Life Cycle and Support Policy” (미국 영어). 2022년 9월 15일에 확인함.  “Semeru Runtimes support”. 《www.ibm.com》 (영어). 2021년 9월 28일. 2021년 10월 15일에 확인함.  “Support roadmap for the Microsoft Build of OpenJDK”. 《docs.microsoft.com》 (미국 영어). 2021년 8월 3일에 확인함. Support for OpenJDK 17 on Windows x86 32 bit will end on January 10th, 2023 following the End of Life support of Windows 32 bit versions.  “Maintainer Resignation” (미국 영어). 2015년 5월 22일. 2022년 9월 7일에 확인함.  “JDK 7u Project Lead” (미국 영어). 2020년 8월 24일. 2022년 9월 7일에 확인함.  “Resigning as JDK 7u Project Lead” (미국 영어). 2022년 9월 5일. 2022년 9월 7일에 확인함.  “New lead for the JDK 8 Update Releases Project: Andrew Haley” (미국 영어). 2019년 2월 1일. 2022년 9월 15일에 확인함.  “New Lead Maintainer for the JDK11 Updates repository: Andrew Haley” (미국 영어). 2019년 2월 18일. 2022년 9월 15일에 확인함.  “Announcing General Availability of Microsoft Build of OpenJDK”. 《Java at Microsoft》 (미국 영어). 2021년 5월 25일. 2021년 8월 3일에 확인함.  “[13u Communication] New Lead Maintainer for the JDK13 Updates repository: Yuri Nesterenko” (미국 영어). 2020년 3월 4일. 2022년 9월 7일에 확인함.  “[15u Communication] Future Lead Maintainer for the JDK15 Updates repository: Yuri Nesterenko” (미국 영어). 2021년 2월 22일. 2022년 9월 7일에 확인함.  “[17u-communication] Future Lead Maintainer for the JDK17 Updates repository: Goetz Lindenmaier” (미국 영어). 2021년 12월 13일. 2022년 9월 15일에 확인함.  “Amazon Corretto FAQs” (미국 영어). 2023년 9월 4일에 확인함.  “JDK Releases”. 《java.com》. 2023년 6월 28일에 확인함.  JDK7 보관됨 2016-12-15 - 웨이백 머신, Sun. “Azul Support Roadmap”. 《Azul | Better Java Performance, Superior Java Support》 (미국 영어). 2023년 6월 28일에 확인함.  “JDK 21”. 《OpenJDK》. 2023년 6월 12일에 확인함.  “Java SE 22 Platform JSR 397”. 《openjdk.org》. 2023년 6월 28일에 확인함.  Official Java SE Downloads Early history of Java Sun Java Supported versions and EOL Downloads archive for older version of Java JDK Releases The Java Version Almanac