Jdk 14 정리

강보훈·2021년 11월 21일
0

JDK연대기

목록 보기
5/14

jdk 14

  1. Pattern matching
    instanceof가 향상되었다. 14부턴 파라미터 체크과 동시에 할당할 수 있다.
    이로써 더 쓰기 좋고 가독성이 좋아졌다.

    if(animal instanceof Dog dog){
    	dog.balk();
    } else if(animal instanceof Lion lion){
    	lion.balk();
    }

    이전버전까지는 타입검사만 하고 따로 캐스팅을 해서 객체를 만들었어야 했다.

    if(animal instanceof Dog){
    	Dog dog = (Dog) animal;
    	dog.balk();
    } else if(animal instanceof Lion lion){
    	Lion lion = (Lion) animal;
    	lion.balk();
    }
  2. Packaging tool (incubator)

    • 설명
      jpackage는 java 프로그램 설치 프로그램 및 패키지를 만드는 커맨드다. 셋업 설정파일, 내부적인 종속성들을 숨기고 설명, 설치, 삭제를 좀 더 접근성 좋게 만들어준다. 그리고 사용자가 jar를 설치하는 필요없이 jar파일에 대해 설치 가능한 패키지도 만들 수 있다.
    • 필요 조건
      1. 패키징에 필요한 어플리케이션, JDK, 패키징 툴에 필요한 소프트웨어가 포함되어야 한다.
      2. jpackage이 사용할 기본 패키징 툴이 있어야한다. 윈도우의 경우 WiX 3.0 or later
    • 패키지 생성
      • --input : 만들 Jar의 위치
      • --name : 설치가능한 패키지 이름
      • --main-jar : 앱 실행 시 시작할 jar 클래스 이름, Manifest.mf에 메인 클래스 이름이 설정되어있다면 이 옵션은 선택 사항
      • -type : 설치 프로그램의 종류 선택, os의 기본 설정을 따라간다. 윈도우의 경우 MSI, EXE를 지원
      • -java-options : 자바 런타임에 전달할 옵션
       jpackage --input target/ \
      --name JPackageDemoApp \
      --main-jar JPackageDemoApp.jar \
      --main-class com.baeldung.java14.jpackagedemoapp.JPackageDemoApp \
      --type dmg \
      --java-options '--enable-preview'
  3. NUMA-Aware Memory Allocation for G1

    • Numa란?
      Non-Uniform Memory Access의 줄임말, 로컬 메모리 엑세스가 메모리 엑세스보다 더 빠르다는 것을 의미한다.
    • G1이란?
      JDK의 기본 GC이며 jdk 14부터 numa-aware하게 되었기에 성능의 향상이 있었다.

    참고자료 : https://sangheon.github.io/2020/11/03/kor-g1-numa.html

  4. JFR Event Streaming
    Android Studio의 프로파일러를 생각하면 편할 듯 하다.

    • JFR이란?
      Java Application에 대한 실시간으로 상태 정보를 수집, 저장해서 문제가 발생 시 원인 분석 및 문제 발생 시기를 분석하는데 필요한 정보를 제공해주는 툴이다.
      블랙박스처럼 데이터를 저장하고 있다가 문제 발생 시 원인 분석을 위해 사용한다.
    • 구현
      소스 종류에 상관없이 이벤트 필터링과 메소드를 제공하는 EventStream구현체인 RecordingStream을 사용하면된다.
      Configuration c = Configuration.getConfiguration("default");
      try (var rs = new RecordingStream(c)) {
        rs.onEvent("jdk.GarbageCollection", System.out::println);
        rs.onEvent("jdk.CPULoad", System.out::println);
        rs.onEvent("jdk.JVMInformation", System.out::println);
        rs.start();
      }
  5. Non-Volatile Mapped Byte Buffers

    • MappedByteBuffer
      맵핑된 메모리의 파일 영역에 대한 작업을 하기위한 ByteBuffer
    • MappedByteBuffer이 이제는 비휘발성 메모리(NVM, Non-volatile Memory)에 접근할 수 있다.
  6. Helpful NullPointerExceptions

    • 기존의 NPE
      기존에는 chain methods에서 npe가 발생할 경우 정확히 어디서 발생한 것이 알 수 없었다.
    • JDK 14 이후
      String name = person.personDetails.name;
      를 실행한 경우
      Exception in thread "main" java.lang.NullPointerException: Cannot read field "name" because "person.personDetails" is null
      at Main.main(Main.java:6)
      와 같이 어디서 null이 나온건지 알 수 있다.
    • 사용 방법
      Intellij 기준
      VM Options에 -XX:+ShowCodeDetailsInExceptionMessages을 추가해주면 된다.
  7. Records

  • 코틀린의 데이터 클래스를 생각하면 된다. 순수하게 데이터를 보유하기 위한 특수 클래스다.
    JDK 14에선 Preview였기에 제대로 지금 사용하려면 Jdk 16+이상에서 사용할 수 있다.
    json serialize도 간단하게 적용할 수 있는 것 같다.

    record Person(
    	String name,
    	Integer age
    ){}
  • 쪼금 더 자세히

  1. Switch Expressions (Standard)
    스위치 문이 좀 더 쓰기 좋게 개선되었다.

    • 기존의 스위치 문
      switch (day) {
              case "MONDAY":
              case "FRIDAY":
              case "SUNDAY":
                  letter = 6;
                  break;
              case "TUESDAY":
                  letter = 7;
                  break;
              case "THURSDAY":
              case "SATURDAY":
                  letter = 8;
                  break;
              case "WEDNESDAY":
              default:
                  letter = 0;
          }
    • JDK 14 이후
      int letter = switch (day) {
          case "MONDAY", "FRIDAY", "SUNDAY" -> 6;
          case "TUESDAY" -> 7;
          case "THURSDAY", "SATURDAY" -> 8;
          case "WEDNESDAY", default -> 0;
      };
  2. Deprecate the Solaris and SPARC Ports

  3. Remove the Concurrent Mark Sweep (CMS) Garbage Collector
    CMS GC가 삭제되었고 G1이 기본으로 변경되었다. G1은 이번 JDK14에서 NUMA가 적용되었다.

  4. ZGC in Windows

    • ZGC란
      • 정지 시간이 최대 10ms를 초과하지 않음
      • Heap의 크기가 증가하더라도 정지 시간이 증가하지 않음
      • 8MB ~ 16TB에 이르는 다양한 범위의 Heap 처리 가능
        이 세가지 조건을 만족하는 GC다.
  5. Deprecate the ParallelScavenge + SerialOld GC Combination

  6. Remove the Pack200 Tools and API

  7. Text Blocks (Second Preview)
    멀티 라인으로 문자열을 작성할 때 매우 좋은 기능이다.

    • 기존의 문자열
      String query = "SELECT \"name\", \"email\" FROM \"users\"\n" +
             "WHERE \"username\" = 'kbh';";
    • Text blocks 적용
      String  query = """
      	SELECT "name", "email" FROM "users"
        	WHERE "username" = 'kbh';
        		""";
      이처럼 매우 간단해졌다.
  8. Foreign-Memory Access API (Incubator)
    다양한 유형의 외부메모리에서 작동이 가능하다.
    기존의 ByteBuffer와 Unsafe Api 두가지 방식 모두 단점이 있기에 극복하고자 나옴

profile
신입 안드로이드 개발자입니다!

0개의 댓글