Java 10

 

var 키워드

- 지역변수에만 사용 가능.

- 컴파일 타임에 타입이 확실한 곳에만 사용 가능.

- 컴파일 타임에 타입 추정(type inference)이 적용되어, 바이트코드는 이전과 동일하게 생성.

 

Unmodifiable View Collections

- 컬렉션을 wrapping하여 변경 불가능한 컬렉션을 만든다.

- immutable 과는 다름. 직접 데이터를 가지고 있지 않고, 원본 인스턴스의 view 로서 작동한다. 원본 인스턴스에 요소가 추가/삭제/변경되면 이를 래핑한 unmodifiable collections 도 변경되어 보여진다. 글자 그대로 VIEW.

List unmodifiable = Collections.unmodifiableList(existingList);

 

Creating Immutable Collections 

- List, Set, Map 에 copyOf(...) 등장. 얉은 복사를 수행하여 immutable collection을 반환한다.

List immutableCopied = List.copyOf(existingList);

- 공간 효율성이 다르다. 아래 코드에서, HashSet 은 내부의 HashMap 을 포함하여 6개의 인스턴스를 가진다:

Set<String> set = new HashSet<>(3);   // 3 buckets
set.add("silly");
set.add("string");
set = Collections.unmodifiableSet(set);

하지만 아래 코드는 2개 필드를 가진 인스턴스를 1개 생성한다. heap 사용률을 줄일 수 있다:

Set<String> set = Set.of("silly", "string");

 

Immutable Collectors

- 스트림의 컬렉터로 immutable collection 을 생성하는 컬렉터가 추가됨:

   Set<Item> immutableSet =
      sourceCollection.stream()
                      .map(...) 
                      .collect(Collectors.toUnmodifiableSet());

G1GC 개선

- Java 9 에서 디폴트 GC 알고리즘으로 채택된 G1GC 의 full gc 방식을 개선.

- Full GC 시 전체 프로세싱을 병렬로 수행하여 성능 향상.

 

CDS (Class Data Sharing) 옵션 추가

- Java 5 에서 도입된 기존 CDS 는 부트스트랩 클래스로더의 대상 클래스만을 쉐어링한다.

- 다음 아규먼트를 통해 시스템 클래스로더와 플랫폼 클래스로더로 쉐어링하도록 설정 가능:

-XX:+UseAppCDS

- 어플리케이션 클래스를 쉐어링하도록 설정할 수 있음:

Step 1. 쉐어링 대상 클래스 지정:

java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=myapp.lst \
  -cp $CLASSPATH $MAIN_CLASS

Step 2. CDS 아카이브 생성:

java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=myapp.lst \
  -XX:SharedArchiveFile=myapp.jsa \
  -cp $CLASSPATH

Step 3. 어플리케이션 실행:

java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa \
    -cp $CLASSPATH $MAIN_CLASS

 

JIT 컴파일러 관련

- 기존 JIT 컴파일러는 C++ 로 작성되어, 변경에 어려움이 있음

- 순수 자바로 JIT 컴파일러를 작성 가능하도록 하는 JVM Compiler Interface (JVMCI) 등장.

- 그 결과로, 순수 자바로 작성된 Graal 등장.

- 아직 실험적인 단계여서, 다음 아규먼트를 설정할 때만 작동:

-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler

 

Thread-Local 핸드셰이크

- 기존 JVM은 모든 쓰레드의 스택트레이스를 얻거나 GC를 수행하기 위해서는 한 모든 쓰레드를 정지시켜야 했음(STW)

- STW 의 이유는, JVM이 작업을 마친 뒤 쓰레드들이 하던 작업을 그대로 다시 수행하도록 하기 위해 글로벌 세이프포인트를 생성하기 위함. 세이프포인트가 있어야 쓰레드가 다시 작동할 컨텍스트를 알 수 있고, 그래야 쓰레드를 멈출 수 있음.

- Java 10 부터 JVM은 임의의 숫자의 쓰레드 세이프포인트를 생성할 수 있음. 고로, 한 번에 한 쓰레드만 멈출 수 있게 됨.

 

컨테이너 인식

- 전까진 JVM은, CPU, 메모리 등의 자원을 호스트 OS 에서 쿼리했음.

- Java 10 부터는 JVM이 도커 컨테이너 안에서 작동하는 경우, 도커 컨테이너에 할당된 자원을 쿼리할 수 있게 됨.

- 예로, Java 9 까지는 호스트 OS 의 가용 메모리가 2G 이고, JVM이 작동하는 컨테이너에는 0.5G 만 할당되어 있는 환경에서 Java는 메모리를 2G 로 쿼리한다. Java 10 부터는 도커의 컨테이너 컨트롤 그룹에서 자원을 쿼리할 수 있도록 하여 컨테이너 환경에서의 실제 가용 자원을 정확하게 얻을 수 있음.

- 컨테이너 환경에서 힙메모리와 프로세서 수를 지정하는 아규먼트가 존재함:

-XX:+UseCGroupMemoryLimitForHeap 
-XX:ActiveProcessorCount=2

 

OpenJDK 의 SSL 관련

 

 

출처: 

https://dzone.com/articles/whats-new-in-java-10

 

'Java > Core' 카테고리의 다른 글

Java 13 간략히 정리  (0) 2020.07.16
Java 12 간략히 정리  (0) 2020.07.15
Java 11 간략히 정리  (0) 2020.07.15
IO, NIO, NIO2  (0) 2020.02.26
람다  (0) 2020.01.05

+ Recent posts