티스토리 뷰

세미나를 위해 준비했던 Java 8과 Java 11 비교 자료.
내가 창조한 자료는 없고 참고자료를 보기 쉽게 짜깁기한 것이라 볼 수 있다.
티스토리는 markdown 문서를 다소 특이하게 출력하는구나, 하지만 일일이 수정하기는 귀찮으므로 이대로.

Java Support RoadMap

릴리즈 출시 공식 업데이트 종료 Premire Support Extended Support
JDK8 2014.03 2019.01 2022.03 2030.12
JDK9 2017.09 2018.03 2018.03 Not Available
JDK10 2018.03 2018.09 2018.09 Not Available
JDK11 2018.09 2019.03 2023.09 2026.09
JDK12 2019.03 2019.09 2019.09 Not Available
JDK13 2019.09 2020.03 2020.03 Not Available
JDK14 2020.03 2020.09 2020.09 Not Available
  • Premire Support : 제품 출시 후 5년간 제공되는 가장 다양한 Java update 지원 유상 서비스
  • Extended Support : Premire Support 종료 후 3년간 제공되는 추가 기술지원 서비스
  • JDK8은 현재 가장 많이 사용되고 있는 안정화된 Java 버전으로 공식 업데이트 기간은 종료되었지만 많이 사용되고 있는 만큼 추가 지원기간이 꽤 길게 잡혀있음
  • JDK11부터 LTS(Long Term Support)가 생겨났으며 Premire + Extended Support로 최대 8년간 보안 업데이트와 버그 수정 지원을 받을 수 있게 되었음

Java SE Support RoadMap

모듈 (Modules)

  • Java Platform Module System(Jigsaw) 추가
  • 필요한 모듈만 모아 경량화된 런타임 환경 이미지 배포 가능
  • Java 클래스, 인터페이스, 리소스의 자동 기술 컬렉션
  • classpath에서 실행되는 대규모 애플리케이션에서 관리하기 어려운 구성 및 캡슐화 문제 해결
  • 애플리케이션에 필요한 구성 요소만 포함하는 런타임 구성 지정 가능
  • 메모리 공간을 더 적게 사용하며 jlink를 사용하여 배포 런타임에 정적으로 연결될 수 있게 함
  • 클래스 로딩을 효율적으로 만들어 런타임이 더 가볍고 빨라짐
  • 패키지와 필요한 구성 요소를 명시적으로 선언하여 강력한 캡슐화 적용 가능
모듈
- name : 모듈 이름 // 패키지 명명 규칙과 유사
- exports : 제공하는 것 // 다른 외부 모듈에서 사용할 수 있도록 공개 API로 간주되는 모든 패키지 목록
- requires : 필요로 하는 것 // 우리의 모듈과 의존 관계가 있는 다른 모듈 목록

module de.codecentric.addresschecker {
    exports de.codecentric.addresschecker.api;
    requires de.codecentric.zipvalidator;
}
기존)
public
private
default
protected

변경)
외부에 모두 public (public to everyone who reads this module (exports))
특정 모듈에만 public (public to some modules that read this module (exports to))
모듈 내부만 public (public to every other class within the module itself)
private
default
protected

Project Jigsaw

프로파일링 및 진단 (Profiling and diagnostics)

Java Flight Recorder (JFR) & Java Mission Control (JMC)

  • Oracle Java의 상용 addon이었던 JFR(Java Flight Recorder)를 오픈소스로 개발
  • JFR: 실행중인 애플리케이션에서 진단 및 프로파일링 데이터 수집
  • JMC: JFR에서 수집한 데이터 분석 및 가공
  • JFR & JMC는 Java 8에서는 상용 기능이지만 Java 11에서는 오픈소스임
  • JFR & JMC를 통해 메모리 누수, GC 오버헤드, 핫 메서드, 스레드 병목 상태 및 I/O 블로킹 등 런타임 문제를 진단 가능함
  • 성능 오버헤드가 1% 미만으로 알려져 있어, 운영 환경에서 사용할 수 있음

JEP 328: Flight Recorder

Mission Control

통합 로깅 (Unified logging)

  • JVM의 모든 구성 요소에 대한 세분화된 로깅 시스템
  • JVM 충돌에 대한 원인 분석 및 성능 문제 진단에 유용

JEP 158: Unified JVM Logging

오버헤드가 낮은 힙 프로파일링 (Low-overhead heap profiling)

  • JVMTI에 추가된 API를 통해 힙 샘플링 가능
  • 라이브 개체와 데드 개체의 정보를 구별하여 수집 가능

JEP 331: Low-Overhead Heap Profiling

StackWalker

  • 스택의 스냅샷 제공
  • 스택 추적을 사용하는 방법을 세부적으로 제어할 수 있는 메서드 제공

JEP 259: Stack-Walking API

가비지 수집 (Garbage collection)

  • 직렬, 병렬, 가비지 우선(Garbage-First), 엡실론(Epsilon) 수집기
  • Java 11에서 기본 가비지 수집기는 G1GC(Garbage-First)
  • Z 가비지 수집기 (ZGC) 대기 시간이 짧은 동시 수집기 (Java 11에서 실험적 기능으로 사용 가능)
  • Shenadoah 수집기는 실행 중인 프로그램과 동시에 더 많은 가비지 수집을 수행하여 GC 일시 중지 시간을 줄이는 수집기

JEP 248: Make G1 the Default Garbage Collector

G1GC

  • 대기 시간과 처리량 간의 균형을 유지하는 것을 목표로 함
  • 높은 확률의 일시 중지 시간 목표를 충족하여 높은 처리량을 달성하려고 함
  • 풀 컬렉션(full collection)을 방지하도록 설계됨
  • 단, 동시 컬렉션으로 메모리를 빠르게 회수하기 어려운 경우 풀 GC 수행

ZGC: A Scalable Low-Latency Garbage Collector (Experimental)

  • GC 일시 중지 시간은 10ms를 초과하지 않음
  • 작은 크기(수백 메가) ~ 매우 큰 크기(수 테라) 범위의 힙을 처리
  • G1에 비해 애플리케이션 처리량이 15%이상 감소하지 않음
  • 향후 GC 최적화를 위한 기반 마련
  • 처음에는 Linux / x64을 지원 (향후 추가 플랫폼 지원 가능)

JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)

병렬 GC (Parallel GC)

  • Java 8의 기본 수집기
  • 여러 스레드를 사용하여 가비지 수집 속도를 높이는 수집기

엡실론 (Epsilon)

  • 메모리를 할당하지만 회수하지는 않음
  • 힙이 소진되면 JVM 종료
  • 수명이 짧거나 가비지를 사용하지 않는 애플리케이션에 유용
  • No-OP GC를 적용하여 GC를 배제함으로써 순수 어플리케이션의 성능, 메모리 부하 등을 테스트할 수 있음(GC 적용 시의 성능과 비교하여 GC의 영향도 측정 가능)
  • 아래 아규먼트로 활성화
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

JEP 318: Epsilon: A No-Op Garbage Collector (Experimental)

Docker 컨테이너의 향상된 기능 (Improvements of docker containers)

  • Java 10 이전에는 컨테이너에 설정된 메모리 및 CPU 제약 조건이 JVM에서 인식되지 않음
  • Java 10 부터 JVM은 컨테이너 제어 그룹(cgroup)에 의해 설정된 제약 조건을 사용하여 메모리 및 CPU 제한을 설정함
  • Docker 컨테이너 사용자가 Java 힙에 사용되는 시스템 메모리 양을 세부적으로 제어할 수 있도록 JVM 옵션도 추가됨

JDK-8146115 : Improve docker container detection and resource configuration usage

다중 릴리스 jar 파일 (Multi-release jar files)

  • 클래스 파일의 여러 Java 릴리스별 버전을 포함하는 jar 파일 생성 가능
  • 라이브러리 개발자는 다중 릴리스 jar 파일을 통해 여러 버전의 Java를 지원할 수 있음

JEP 238: Multi-Release JAR Files

기타 성능 향상 (Miscellaneous performance improvements)

분할된 코드 캐시 (Segmented Code Cache)

  • 코드 캐시를 고유 세그먼트로 나눔
  • JVM 메모리 공간을 보다 효율적으로 제어 가능
  • 컴파일된 메서드의 검색 시간 단축 가능
  • 코드 캐시의 조각화 감소 및 성능 향상

JEP 197: Segmented Code Cache

압축 문자열 (Compact Strings)

  • char 인코딩에 따라 문자열의 내부 표현을 char당 2bytes에서 Latin-1(1byte)와 UTF-16(2bytes)로 변경
  • 만일 영어만 있는 문자열의 경우 1byte의 영역을 차지해 메모리 공간 절약 가능

JEP 254: Compact Strings

애플리케이션 클래스-데이터 공유 (Application Class-Data Sharing)

  • 보관된 클래스가 런타임에 메모리에 매핑되도록 허용하여 시작 시간을 줄임
  • 클래스를 CDS 보관함에 배치할 수 있또록 하여 클래스-데이터 공유를 확장함
  • JVM에서 공통으로 사용하는 클래스들을 공유하는 저장소에 위치시키고 이를 공유하여 사용 (전체 시스템 응답 시간 단축)

JEP 310: Application Class-Data Sharing

스레드-로컬 핸드셰이크 (Thread-Local Handshakes)

  • 글로벌 VM 세이프포인트를 수행하지 않고 스레드에서 콜백을 실행할 수 있도록 함
  • VM에서 글로벌 세이프포인트의 수를 줄여 대기 시간을 줄이는 데 도움이 됨

JEP 312: Thread-Local Handshakes

Lazy Allocation of Compiler Threads

  • VM은 단계별 컴파일 모드에서 다량의 컴파일러 스레드를 시작하는데, 이러한 스레드는 사용 가능한 메모리 또는 컴파일 요청 수에 관계없이 생성됨 (스레드가 유휴 상태일 때 메모리를 사용하므로 리소스를 비효율적으로 사용)
  • 이러한 문제를 해결하기 위해 시작 시 각 유형의 컴파일러 스레드를 하나씩만 시작하도록 변경됨

JDK-8198756 : Lazy allocation of compiler threads

변수 핸들 (Variable Handles)

  • 동시 및 병렬 프로그래밍에서 사용했던 기존의 java.util.concurrent.atomic 또는 sun.misc.Unsafe 보다 일관적인 방법의 읽기/쓰기 메소드 제공

JEP 193: Variable Handles

컬렉션에 대한 편의성 팩터리 메서드 (Convenience Factory Methods for Collections)

  • 불변 Collection을 만들 수 있는 메서드 추가
// java8
Set<String> set = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(toSet()));

// 이후 java
Set<String> set = Set.of("a", "b", "c");
List.of(a, b, c);
Set.of(d, e, f, g);
Map.of()
Map.of(k1, v1)
Map.ofEntries(
    entry(k1, v1),
    entry(k2, v2),
    entry(k3, v3),
    // ...
    entry(kn, vn));
  • Stream 패키지의 Collectors 클래스에 다음 메서드 추가
  • Stream의 요소를 Unmodifiable Collections에 수집 가능
Collector toUnmodifiableList();
Collector toUnmodifiableSet();
Collector toUnmodifiableMap(Function, Function);
Collector toUnmodifiableMap(Function, Function, BinaryOperator);

JEP 269: Convenience Factory Methods for Collections

스핀-대기 힌트 (Spin-Wait Hints)

  • 스핀 루프에 있음(busy-wait 상태)을 런타임 시스템에 암시할 수 있는 API 제공

JEP 285: Spin-Wait Hints

HTTP 클라이언트 - 표준 (HTTP Client - Standard)

  • java.net.http 패키지로 표준화
  • 구버전의 HttpUrlConnection를 대체
  • Non-Blocking request and response 지원 (with CompletableFuture)
  • Backpressure 지원(java.util.concurrent.Flow 패키지를 통해 RX Flow를 구현체에 적용)
  • HTTP/2 지원
  • Factory method 형태로 지원
  • WebSocket 지원

JEP 321: HTTP Client

기타 기능 향상

JShell

  • javascript, python 같은 인터프리터 언어의 shell 환경처럼 바로 코드를 작성하고 결과를 확인할 수 있는 REPL(Read-Eval-Print-Loop) 도구 제공
//usr/bin/env jshell --show-version "$0" "$@"; exit $?
System.out.println("Hello World")
/exit

HTML5 Javadoc / Javadoc Search

  • (기존) HTML 4.01 형식으로 Javadoc을 생성 --> (변경) HTML5 방식의 마크업으로 Javadoc 생성 가능

UTF-8 Property Files

  • Property File에 대한 기본 인코딩 : (기존) ISO-8859-1 --> (변경) UTF-8

Unicode 8.0

  • (기존) Unicode 6.1 지원 --> (변경) Unicode 8.0 지원

SHA-3 Hash Algorithms

  • SHA-1, SHA-2 표준 해시 함수를 대체하는 진보된 암호화 해시 함수 제공

Deprecate the Applet API

  • 더 이상 브라우저에서 사용하지 않는 Applet API에 대한 지원 종료

Private Interface Method

  • interface에 private method / private static method라는 새로운 기능 제공
public interface IMyInterface {

    private void method1(String arg) {
    // do something
    }

    private static void method2(Integer arg) {
    // do something
    }
}

Improved try-with-resource

  • java7에서 등장했던 try-with-resource의 불편사항 개선
void tryWithResourcesByJava7() throws IOException {
BufferedReader reader1 = new BufferedReader(new FileReader("test.txt"));
    try (BufferedReader reader2 = reader1) {
        // do something
    }
}
// final or effectively final이 적용되어 reader 참조를 사용할 수 있음
void tryWithResourcesByJava9() throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader("test.txt"));
try (reader) {
        // do something
    }
}

Improved Diamond Operator

  • 익명 클래스에 Diamond Operator 사용 가능
// java7,8
MyHandler<Integer> intHandler = new MyHandler<>(10) { // Anonymous Class };  //오류

// java9
MyHandler<Integer> intHandler = new MyHandler<>(10) {
    @Override
    public void handle() {
        // handling code...
    }
};

Improved Stream

  • 비동기 프로그래밍에 대한 개선사항
  • iterate(), takeWhile()/dropWhile(), ofNullable()

Optional class Stream

  • Optional class에 or(), ifPresentOrElse(), stream() 메서드 추가

Local-variable type inference

  • 지역변수에 대해서는 var 타입을 통해 type 명시 생략 가능
  • 람다 표현식에서도 사용 가능
//Java 1.6 or earlier jvm version
List<String> list = new ArrayList<String>();
//Java 1.7 or later jvm version
List<String> list = new ArrayList<>();
//Java 10
var list = new ArrayList<String>();
var stream = list.stream();

Additional Unicode Language-Tag Extensions

  • java.util.Locale 클래스의 향상된 버전으로 Java9에서 제공되는 BCP 47 Language tag에 몇 가지를 더 추가한 버전
cu (currency type)
fw (first day of week)
rg (region override)
tz (time zone)

Time-Based Release versioning

  • Java SE Platform과 JDK의 버전 명시에 대한 기준 추가
  • 새로운 버전 모델인 'Six-month release model'을 적용하기 위한 버전 표기법
$FEATURE.$INTERIM.$UPDATE.$PATCH
$FEATURE - 주버전. Feature의 번호를 나타내는 값입니다. 기능의 내용에 상관없이 기능별로 번호가 하나씩 증가합니다.
$INTERIM - 개선 버전. 하위버전과 호환되는 Bug fixes와 enhancements의 경우에 증가하는 버전입니다.
$UPDATE - 업데이트 버전. 새로운 Feature에서 보안문제, 버그 등을 해결하는 경우에 증가하는 버전입니다.
$PATCH - 중요한 문제를 해결하기 위해 비상으로 업데이트 될 경우에 증가하는 버전입니다.
Version version = Runtime.version(); // java version "10.0.1" 2018-04-17
version.feature();
version.interim();
version.update();
version.patch();

Output:

10
0
1
0

Launch Single-File Source-Code Programs

  • javac를 통한 컴파일 없이 java 파일을 실행할 수 있음
    $> java HelloWorld
    Hello world!!
  • java 파일에 main 메서드가 존재해야 함
  • 다음과 같이 클래스패스 지정
    java --class-path=/myclasspath ExecutionTest.java

문자열 메서드 추가

  • strip(): 문자열 앞, 뒤의 공백 제거
  • stripLeading(): 문자열 앞의 공백 제거
  • stripTrailing(): 문자열 뒤의 공백 제거
  • isBlank(): 문자열이 비어있거나 공백만 포함되어 있을 경우 true 를 반환 - String.trim().isEmpty() 호출 결과와 동일
  • lines(): 문자열을 라인 단위로 쪼개는 스트림을 반환
  • repeat(n): 지정된 수 만큼 문자열을 반복하여 붙여 반환
String str = "ABC";
String repeated = str.repeat(3);        // "ABCABCABC"

참고자료

'공부' 카테고리의 다른 글

Return Early Pattern  (4) 2022.03.30
댓글