서둘러 수집하세요. Java 9~Java 17의 주요 업데이트가 여기 있습니다.

James Gosling: Java8을 계속 고수하는 친구에게 "변화를 만들 때입니다."라고 말하고 싶습니다. 새로운 시스템은 보다 포괄적이고 빠르며 오류가 적고 보다 효율적으로 확장됩니다. 어떤 관점에서 보든 모두가 JDK17을 받아들일 이유가 있습니다. 실제로 모든 사람은 JDK8에서 JDK9로 업그레이드할 때 작은 문제에 직면하게 될 것입니다. 이는 Java 개발 역사상 거의 유일한 주요 버전 변경입니다. 대부분의 경우 이전 버전에서 최신 버전의 Java로 전환하는 것은 간단합니다. 새 버전을 직접 설치하면 모든 것이 정상적으로 작동합니다. 안정적이고 중단 없는 업그레이드는 오랫동안 Java의 특징 중 하나였으며 우리는 그 호의를 망치고 싶지 않습니다.

최근 인터뷰에서 제임스 고슬링이 "자바 버전이 비교적 빠르게 업데이트됐다. 최신 자바 17 버전이 몇 달 전에 출시됐지만 여전히 자바 8이 개발자들이 주로 사용하는 버전이다. 새 버전 '총애'를 받지 못하는 가장 큰 이유는 무엇이라고 생각하시나요?" 시가 답했다.

곧 출시될 Spring 프레임워크 6 및 Spring Boot 3의 공식 릴리스에서 가장 낮은 Java 버전은 Java 17에서 바로 시작됩니다.

이와 같이 최신 버전의 Spring 기능을 사용하기 위해 Java 8에서 Java 17로 업그레이드해야 하고 건너뛴 버전의 주요 내용을 이해하지 못한다면 분명히 많은 문제에 직면하게 될 것입니다.

따라서 여기서 Qiang 형제는 수집할 가치가 있는 Java 9에서 Java 17로의 주요 콘텐츠 업데이트를 요약하는 데 도움을 줄 것입니다.

자바 9

주요 업데이트:

  • 플랫폼 모듈 시스템(직소 프로젝트)

  • 인터페이스 전용 메서드

  • 시도 리소스

  • @SafeVarargs 주석

  • 컬렉션 팩토리 메서드

  • 프로세스 API 개선

  • JShell:javashell(REPL)

  • 스트리밍 API 개선

Java 9의 가장 큰 특징은 모듈성 개념의 도입입니다. 즉, 모듈의 유형과 리소스를 캡슐화하고 공개 유형이 다른 모듈에서 액세스할 수 있는 패키지만 내보내는 것입니다. 일부는 프런트 엔드 프레임워크의 내보내기 및 가져오기와 유사합니다.

모듈의 패키지를 내보내거나 열지 않은 경우 모듈 디자이너가 모듈 외부에서 해당 패키지를 사용하지 않았음을 의미합니다. 이러한 패키지는 예고 없이 모듈에서 수정되거나 제거될 수 있습니다.

동시에 모듈화는 rt.jar 패키지를 분할하여 ClassLoader의 해당 조정을 초래합니다.

Java 9 이전의 ClassLoader

  • Bootstrap ClassLoader는 rt.jar, jre/lib/endorsed를 로드합니다.

  • Ext ClassLoader는 jre/lib/ext를 로드합니다.

  • Application ClassLoader는 -cp로 지정된 클래스를 로드합니다.

Java 9 이상용 ClassLoader

  • Bootstrap ClassLoader는 라이브러리/모듈을 로드합니다.

  • Ext ClassLoader는 Platform ClassLoader로 이름이 변경되어 lib/modules를 로드합니다.

  • Application ClassLoader는 -cp, -mp로 지정된 클래스를 로드합니다.

  • Application ClassLoader 상위 클래스는 더 이상 URLClassLoader가 아닙니다.

반면 인터페이스 전용 메서드를 사용하면 비추상 메서드 간에 공통 코드를 공유하는 데 도움이 되는 전용 메서드를 선언할 수 있습니다. Java 9 이전에는 인터페이스에서 전용 메서드를 만드는 것이 컴파일 타임 오류였습니다.

자바 10

주요 업데이트:

  • 지역 변수에 대한 유형 유추.

  • 애플리케이션 클래스 데이터 공유. 시작 및 설치 공간을 개선하기 위해 기존 클래스 데이터 공유("CDS") 기능이 확장되어 응용 프로그램 클래스를 공유 아카이브에 배치할 수 있습니다.

  • G1에 병렬 전체 GC 도입

  • 스레드 로컬 제어. 모든 스레드를 활성화하거나 중지하는 대신 개별 스레드를 중지할 수 있습니다.

  • Java 기반 JIT 컴파일러(실험 버전)

지역 변수 유형 유추는 Java 10의 개발자를 위한 가장 큰 새 기능입니다. 이니셜라이저를 사용하여 지역 변수 선언에 형식 유추를 추가합니다. 로컬 유형 유추는 다음과 같은 경우에만 사용할 수 있습니다.

  • 이니셜라이저가 있는 지역 변수로 제한됨

  • for 루프의 향상된 인덱싱

  • for 루프에서 선언된 지역

사실 JS와 유사한 var 변수이며 사용법은 다음과 같다.

var numbers = List.of(1, 2, 3, 4, 5); // inferred value ArrayList<String>// Index of Enhanced For Loopfor (var number : numbers) {
   
       System.out.println(number);}// Local variable declared in a loopfor (var i = 0; i < numbers.size(); i++) {
   
       System.out.println(numbers.get(i));}

Parallel FullGC를 G1에 소개: G1 가비지 수집기는 jdk9의 기본값입니다. G1 가비지 수집기는 전체 가비지 수집을 방지하지만 수집에 사용되는 동시 스레드가 메모리를 충분히 빠르게 복원할 수 없을 때 사용자 경험이 저하됩니다.

이 변경 사항은 전체 GC를 병렬로 만들어 G1 최악의 대기 시간을 개선합니다. G1 수집기의 마크 스윕 압축 알고리즘은 이 변경의 일부로 병렬화되었으며 수집에 사용되는 동시 스레드가 충분히 빠르게 메모리를 복구할 수 없을 때 트리거됩니다.

Java 기반 실험적 JIT 컴파일러: Java 기반 JIT 컴파일러 Graal은 Java 10에서 활성화되었으며 테스트 및 디버깅을 시작하기 위해 Linux/x64 플랫폼에서 실험적 JIT 컴파일러로 사용되었습니다.

Graal은 Java 기반 프로그래밍 언어를 위한 Java 바이트코드 지향 컴파일러입니다. C++로 구현된 C1 및 C2와 비교할 때 모듈화가 더 명확하고 유지 관리가 더 쉽습니다. Graal 컴파일러 연구 프로젝트를 Java로 가져오면 C++로 작성된 현재 버전과 일치하는(또는 다행스럽게도 능가하는) JVM 성능의 기반을 제공할 수 있습니다.

자바 11(LTS)

주요 업데이트:

  • GC 가비지 컬렉터

  • 지역 변수 유형 추론

  • 문자열 향상

  • 수집 강화

  • 향상된 스트림

  • 선택적 향상

  • 향상된 InputStream

  • HTTP 클라이언트 API

  • 복잡성을 단순화하고 하나의 명령으로 소스 코드를 컴파일 및 실행

가장 큰 변화는 리눅스 버전에 ZGC가 추가되었다는 점이다. ZGC는 Linux X64의 JDK 11 이상에서 사용할 수 있으며 Mac 및 Windows에서 사용하려면 JDK 15가 필요합니다. Java 11 ZGC의 측정된 gc 시간은 약 3ms에서 안정적입니다(물론 장면과 관련이 있을 수 있으며 공식 구경은 일반적으로 10ms 미만입니다).

ZGC는 동시, 지역 기반의 소형 가비지 수집기입니다.루트 스캔 단계만 STW이므로 힙의 성장과 살아남은 개체의 성장에 따라 GC 일시 중지 시간이 증가하지 않습니다. ZGC 및 G1 일시 중지 시간 비교:

ZGC  avg: 1.091ms (+/-0.215ms)  95th percentile: 1.380ms  99th percentile: 1.512ms  99.9th percentile: 1.663ms  99.99th percentile: 1.681ms  max: 1.681ms  G1  avg: 156.806ms (+/-71.126ms)  95th percentile: 316.672ms  99th percentile: 428.095ms  99.9th percentile: 543.846ms  99.99th percentile: 543.846ms  max: 543.846ms

동시에 언급해야 할 사항은 2018.9 이후 Java 11 릴리스와 함께 Oracle JDK가 공식적으로 상용화된다는 것입니다(개발 비용은 무료이지만 온라인 비즈니스 운영 비용은 청구됨). 그러나 동시에 Oracle은 OpenJDK와 Oracle JDK 간에 기능적 차이가 없을 것이라고 발표했습니다. 또한 OpenJDK 11 RTS는 Red Hat 커뮤니티에서 유지 관리됩니다. 이를 통해 안정성이 더욱 향상되고 적시에 문제를 해결할 수 있습니다.

자바 12

주요 업데이트:

  • Shenandoah: 일시 중지 시간이 짧은 GC

  • 스위치 식

  • JVM 상수 API

  • 기본 클래스 데이터 공유 아카이브

  • 종료 가능한 G1 혼합 GC

  • G1은 미사용 할당 메모리를 제 시간에 반환합니다.

새로운 가비지 수집기가 Java 12에 도입되었습니다. Shenandoah는 Java 12에서 중단 시간이 낮거나 중간인 가비지 수집기로 도입되었으며 Java 애플리케이션에서 실행 스레드와 동시에 실행하여 작동합니다. 가비지 수집 및 메모리 복구를 수행하려면 이 작업 모드는 가상 머신에 짧은 일시 중지 시간을 가져옵니다.

한편, G1 GC는 Java12에서 계속 개선되고 있습니다. 운영 체제에 최대 메모리 양을 반환한다는 목표를 달성하기 위해 G1은 애플리케이션 비활성 기간 동안 주기적으로 동시 주기를 실행하거나 트리거하여 전체 Java 힙 사용량을 결정합니다. 이로 인해 Java 힙의 사용되지 않은 부분이 운영 체제에 자동으로 반환됩니다. 사용자가 제어하는 ​​동안 전체 GC를 선택적으로 수행하여 반환되는 메모리 양을 최대화할 수 있습니다.

일시 중지 목표를 초과할 가능성이 있는 경우 혼합 GC의 G1을 중단 가능하게 만듭니다.

자바 13

메인 콘텐츠:

  • ZGC를 강화하여 사용하지 않는 메모리 해제

  • 소켓 API 리팩토링

  • 스위치 표현식 확장(미리보기 기능)

  • 텍스트 블록(미리보기 기능)

Java 13의 주요 기능은 ZGC를 향상시키는 것입니다. 즉, 사용하지 않는 메모리를 해제하는 것입니다. ZGC는 Java 11의 실험적 도입입니다. 주로 GC 일시 중지 시간을 개선하는 데 사용되며 수백 MB에서 수 TB 크기의 힙을 지원하며 애플리케이션 처리량은 15% 이상 떨어지지 않습니다.

실제 사용을 통해 ZGC 수집기는 Hotspot의 G1 및 Shenandoah 가비지 수집기와 같이 운영 체제에 사용하지 않는 메모리를 능동적으로 해제하는 기능이 없음을 알 수 있습니다. 대부분의 애플리케이션에서 CPU와 메모리는 특히 현재 사용 중인 클라우드 또는 가상화 환경에서 제한적이고 부족한 리소스입니다. 응용 프로그램의 메모리가 오랫동안 유휴 상태이고 운영 체제에 해제할 수 없는 경우 메모리가 필요한 다른 응용 프로그램은 필요한 메모리를 할당할 수 없으며 여기에서 응용 프로그램이 할당한 메모리는 여전히 유휴 상태입니다. 너무 바쁘다, 너무 바쁘다"라는 불공정한 상태이며 가상화 기반 환경에서 실제로 사용되지 않는 리소스에 대한 초과 지불로 이어지기 쉽습니다. 사용하지 않는 메모리를 시스템 메인 메모리로 비우는 것은 매우 유용하고 절실히 필요한 기능입니다.

Java 13의 ZGC 개선 사항은 주로 다음 사항에 반영됩니다.

  • 사용하지 않는 메모리를 운영 체제로 해제

  • 16TB의 최대 힙 크기 지원

  • 소프트 제한 힙 크기에 매개변수 추가: -XX:SoftMaxHeapSize

Java 13에서는 ZGC 메모리 해제 기능이 기본적으로 활성화되어 있지만 -XX: -ZUncommit 매개변수를 사용하여 명시적으로 비활성화할 수 있으며 최소 힙 크기(-Xms)가 최대 힙과 동일하게 구성된 경우 크기(-Xmx) , 이 기능은 암시적으로 비활성화됩니다.

-XX:ZUncommitDelay=<seconds>(기본값은 300초) 매개변수를 사용하여 지연 해제를 구성할 수도 있습니다. 이 지연 시간은 사용하지 않은 메모리가 해제되기까지 걸리는 시간을 지정할 수 있습니다.

자바 14

메인 콘텐츠:

  • Java 12 및 13에서 처음 표시되는 개선된 스위치 표현식이 Java 14에서 완전히 지원됨

  • instanceof는 패턴 매칭을 지원합니다(언어 기능).

  • 레코드 기능으로 get, equals() 및 기타 메소드를 작성할 필요가 없습니다.

  • NullPointerException(JVM 기능), 어떤 라인이 정확한지

  • 자바 패키징 도구 jpackage의 미리보기가 추가되었습니다.

식 전환, break 대신 화살표 ->를 사용할 수 있습니다.

var log = switch (event) {
   
     case PLAY -> "User has triggered the play button";  case STOP, PAUSE -> "User needs a break";  default -> {
   
        "default"  }};

instanceof는 패턴 매칭을 지원합니다(언어 기능).

Object obj = "java 14";//测试一把if (obj instanceof String sss && sss.length() > 5) {
   
       System.out.println(sss.contains("b"));    System.out.println("这是字符串!sss" + sss);} else {
   
       System.out.println("其他~");}

동시에 ZGC가 확장되어 ZGC가 macOS 및 Windows(버전 제한됨)에서 사용될 수 있습니다. 주로 두 시스템 간의 차이점과 Linux 시스템의 기본 메모리 매핑 메커니즘과 호환되기 때문입니다.

자바 15

메인 콘텐츠:

  • ZGC는 실험적 기능에서 제품으로 업그레이드됩니다.

  • Char는 CharSequence에 isEmpty 기본 메서드를 추가합니다.

  • 유니코드 13.0 지원

  • JEP 371 숨겨진 클래스

  • TreeMap 메서드의 전용 구현

  • 원격 JMX에 대한 세 번째 포트를 구성하는 기능이 추가되었습니다.

Java 15 버전 ZGC는 실험적 기능에서 제품으로 업그레이드됩니다.

ZGC는 2018년 9월에 출시된 JDK 11에 통합되었으며 확장 가능한 저지연 가비지 수집기입니다. ZGC의 도입은 Java 개발자가 이러한 크기와 복잡성의 기능을 신중하고 점진적으로 도입해야 한다고 결정했기 때문에 실험적인 기능이었습니다. 그 이후로 동시 클래스 언로드, 미사용 메모리 커밋 해제, 데이터 클래스 공유 지원, 향상된 NUMA 인식 및 다중 스레드 힙 프리터칭에 이르기까지 많은 개선 사항이 추가되었습니다. 또한 최대 힙 크기가 4TB에서 16TB로 증가했습니다. 지원되는 플랫폼에는 Linux, Windows 및 MacOS가 포함됩니다.

마찬가지로 Shenandoah GC가 있습니다.

자바 16

메인 콘텐츠:

  • 레코드가 공식적으로 사용 중입니다.

  • jpackage 도구는 공식적으로 사용됩니다.

  • instanceof 공식적으로 사용

ㅎㅎ 이번 버전은 업데이트가 별로 없네요 인터넷에 다음과 같은 우스갯소리가 있습니다.

미국의 한 대기업은 공장에서 JRE 설치 후 시스템 시동 시간이 늘어난다는 항의를 받고 지난주 JRE를 사전 설치하지 않기로 했다는 공지를 냈다. 또한 JRE를 수락하지 않기로 결정했습니다. 그래서 Sun은 서둘러 업데이트 16 버전을 사용자 지정했습니다. 주요 업데이트는 설치 매개 변수에 명령(예: noupdate)을 추가하는 것입니다....

자바 17(LTS)

메인 콘텐츠:

  • 향상된 의사 난수 알고리즘.

  • Oracle JDK16에 포함되지 않은 AOT AOT 컴파일 및 JIT JIT 컴파일 기능을 제거합니다.

  • 봉인된 수정 클래스 및 인터페이스는 다른 클래스 또는 인터페이스의 확장 및 구현을 제한합니다. 직설적으로 말하면 클래스 상속이나 인터페이스 구현 횟수를 제한하는 것이다.

  • 스위치 구문의 패턴 일치가 더욱 향상되어 스위치 아래에서 모든 것을 사용할 수 있습니다.

이 버전에는 업데이트가 많지 않지만 장기 지원 버전이기도 합니다. 동시에 Oracle JDK는 상업용으로 무료라고 발표했습니다. 또한 기사의 시작 부분에서 언급했듯이 Spring 프레임워크 6과 Spring Boot 3는 모두 Java 17을 기반으로 합니다. 따라서 이 버전은 개발자에게 여전히 더 중요합니다.

자, 드디어 Java 9~Java 17의 주요 업데이트가 정리되었습니다. Brother Qiang의 정렬도 일부 버전 콘텐츠를 선택적으로 무시했습니다. 주로 강조합니다. 각 버전의 구체적인 업데이트 내용에 대해 더 알고 싶다면 JDK 공식 웹 사이트에서도 확인할 수 있습니다.

여기요~

 

おすすめ

転載: blog.csdn.net/qq_35956444/article/details/123005987