ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 10 Features
    java 2019. 5. 12. 13:22

    개요


    자바 10에 새로 추가된 특징들을 알아본다.

    (OpenJDK 기준)

    * 출시일: 2018-03-20

     

    특징


    1. Local-Variable Type Inference


    로컬 변수 타입을 'var'로 선언할 수 있게 되었다. 다음과 같은 케이스에만 적용된다.  

    initializer와 함께 선언되는 로컬 변수

    ex.

    var list = new ArrayList<String>(); // infers ArrayList<String>
    var stream = list.stream(); // infers Stream<String>
    

    enhanced for-loop 내 index 변수

    for(var user : users) { ... }

    traditional for-loop 내 로컬 변수

    for(var i = 0; i<10; i++) { ... }

    'var'은 keyword가 아니라 reserved type name이다. (둘의 차이는 명확히 이해하지 못했으나, 컴파일러 수행 단계의 차이로 추측된다. 

    참고: https://stackoverflow.com/questions/49102553/what-is-the-conceptual-difference-between-a-restricted-keyword-and-reserved-t)

     

    따라서, var이라는 이름은 변수명, 메소드명, 패키지명으로 사용 가능하다. 즉, 기존 코드에 var이라는 변수명이 있더라도 걱정할 필요 없다. 다만 클래스명으로는 사용할 수 없다. (어차피 컨벤션 상 'class var'이라는 클래스를 선언하는 일은 흔치 않다.)

     

    한편, target type이 명확히 추론되지 않는 미묘한 경우에는 사용할 수 없다. 따라서, 명확히 type이 드러나는 경우에 var을 사용하는 것이 좋다. 

    참고: var style guide

     

    'var'은 컴파일 타임에 타입 추론이 진행된다. 따라서 성능에 영향을 주지 않는다.

     

    참고: 

    http://openjdk.java.net/jeps/286
    https://howtodoinjava.com/java10/var-local-variable-type-inference/

     

     

    2. Consolidate the JDK Forest into a Single Repository


    기존 JDK 9의 root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn이라는 8개의 repository를 하나의 repository로 통합하였다.

    참고: http://openjdk.java.net/jeps/296

     

     

    3. Garbage Collector Interface


    다양한 GC의 코드 고립도를 향상시키는 인터페이스를 도입하였다. (자바 11의 ZGC 구현을 가능케하는 피쳐이다.)

    참고: http://openjdk.java.net/jeps/304

     

     

    4. Parallel Full GC for G1


    자바 9에 디폴트 GC로 선정된 concurrent collector인 G1에 full parallel GC 기능을 탑재하였다. 본래 G1은 full GC를 회피하도록 고안되었지만, Young area가 충분히 확보되지 못하면, full GC가 수행될 수 밖에 없다. 그런데, concurrent collector는 parallel collector보다 full GC 속도가 느리다. 이에 따라 자바 10에서는 G1의 본래 싱글 스레드 기반 full GC를 parallel full GC로 바꾸었다. 쓰레드의 수는 

    -XX:ParallelGCThreads 옵션으로 조절할 수 있다.

    참고: http://openjdk.java.net/jeps/307

     

     

    5. Application Class-Data Sharing


    자바 5에 존재하던 Class-Data Sharing(CDS)는 class들을 사전 처리하여 공유 아카이브에 넣어놓고, 다른 자바 프로세스들이 공유할 수 있어 startup과 footprint 시간을 감소시킬 수 있는 기능이다. 하지만 이는 bootstrap class loader만이 아카이브 class를 로드할 수 있도록 하였다. 이번 자바 10에서는 기존 CDS를 app class loader까지 확장 적용하여 보다 더 startup, footprint 시간을 감소시킬 수 있게 되었다. (AppCDS)

    참고: http://openjdk.java.net/jeps/310

     

     

    6. Thread-Local Handshakes


    VM safepoint를 수행할 필요 없이 개별 쓰레드를 stop시키고, 콜백을 수행하도록 할 수 있는 기능을 도입하였다.  

    VM safepoint란?

    "Stop The World"로 표현되며, 모든 쓰레드를 일시 정지시키는 작업이다. safepoint를 발생시키는 몇몇 경우는 다음과 같다.

    - Garbage collection pauses

    - Code deoptimization

    - Flusing code cache

    - Class redefinition (e.g. hot swap or instrumentation)

    - Biased lock revocation

    - Various debug operation (e.g. deadlock check or stacktrace dump)

    주로 GC 작업 때 발생한다.

    참고: http://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html

     

    (자바 11의 ZGC 구현을 가능케하는 피쳐이다.)

     

    참고: http://openjdk.java.net/jeps/312

     

     

    7.  Remove the Native-Header Generation Tool (javah)


    javah tool을 제거하였다.  

    javah: 코드에 native method들을 사용할 경우 JNI 헤더 파일들을 생성해준다. 자바 8부터 javac에서 이 기능을 지원하기 때문에 제거되었다.

     

    참고: http://openjdk.java.net/jeps/313

     

     

    8. Heap Allocation on Alternative Memory Device


    HotSpot VM이 자바 오브젝트 힙을 대체 메모리 디바이스(ex. NV-DIMM: 비휘발성 NAND 플래시 메모리)에 할당하는 것을 가능하게 하였다. XX:AllocateHeapAt=<path> 옵션으로 설정 가능하다.

     

    참고: http://openjdk.java.net/jeps/316

     

     

    9. Root Certificates


    HTTPS 통신에 쓰이는 SSL/TLS 인증서를 발급해주는 인증 기관인 CA 중에서 root CA 목록을 브라우저와 마찬가지로 Oracle JDK에서도 가지고 있다. OpenJDK도 이를 자바 10부터 지원한다.

     

     

    10. 기타 특징


    구체적인 설명이 필요 없다고 여겨지는 이외 특징들을 아래 나열한다.  

     

    1. Time-Based Release Versioning: 자바 릴리즈 주기 변경으로 versioning format 변경 

    (참고: http://openjdk.java.net/jeps/322)

     

    2. Experimental Java-Based JIT Compiler: 자바 기반 JIT compiler인 Graal을 Linux/x64 플랫폼에서 사용할 수 있게 한다. (아직 실헙 단계, -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler 옵션을 사용한다.)

    참고: http://openjdk.java.net/jeps/317

     

    3. Additional Unicode Language-Tag Extensions (참고: http://openjdk.java.net/jeps/314)

     

     

    참고


    http://openjdk.java.net/projects/jdk/10/
    http://itstory.tk/entry/Java-10-%EC%8B%A0%EA%B7%9C-%EA%B8%B0%EB%8A%A5%ED%8A%B9%EC%A7%95-%EC%A0%95%EB%A6%AC
    http://blog.ragozin.info/2012/10/safepoints-in-hotspot-jvm.html

     

     

    'java' 카테고리의 다른 글

    Java equals() & hashcode()  (0) 2019.05.13
    Java Lambda  (0) 2019.05.12
    Java 11 Features  (0) 2019.05.12

    댓글

Designed by Tistory.