Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java 9 - Java 14: Featuers and Enhancements

Java 9 - Java 14: Featuers and Enhancements

This session shares notable changes in the Java ecosystem starting from Java 8 all the way until Java 14. No vendor-specific changes or enhancements are covered.

Given the breadth of the topic and a time limit, this session will only cover the most notable or impactful changes.

For instance, Java 9 introduced 150 new features: Java 9 changes focus on programmatic/syntactic changes for most part but will cover the new Java Module system JPMS, since it makes a huge impact for library developers.

Similar constraints apply for Java 10, 11, 12, 13 and 14. However, post-Java 9, the release cadence of 6 months has greatly reduced the number of features delivered making the content more viable to present a larger percentage of changes.

Chandra Guntur

May 18, 2020
Tweet

More Decks by Chandra Guntur

Other Decks in Technology

Transcript

  1. @CGuntur Java 9 - 14 1 Key Features and Enhancements

    Chandra Guntur Twitter: @CGuntur
  2. @CGuntur Java 9 •Released: Sep. 2017 •=> Java 8 was

    Mar. 2014 •150 new features and enhancements •One of the largest upgrades to Java •https://openjdk.java.net/projects/jdk9/ •https://speakerdeck.com/cguntur/java-9-new-features 3
  3. @CGuntur Private Methods in Interfaces (1) •To share common code

    between methods •Methods with bodies: static and default •private default & private abstract not valid combinations •Originally in Java 8 experimental, dropped •https://bugs.openjdk.java.net/browse/JDK-8071453 4 Java 9 Writeup: https://cguntur.me/2017/09/02/java-9-features-private-interface-methods/
  4. @CGuntur Collections - Factory Methods • Allow ease of declaration/instantiation

    • Examples: •List.of("one", “two"); •Map.of("key1", "val1", "key2, "val2"); • JEP 269 - Convenience Collection Factory Methods: 
 http://openjdk.java.net/jeps/269 • https://blogs.oracle.com/java/collections-refueled 6 Java 9
  5. @CGuntur G1GC - Default Garbage Collector •Introduced in Java 7,

    targeted for Java 8 •JVM now uses a Metaspace instead of PermGen •GC focusses on garbage-heavy regions •JEP 248 - Make G1 the default collector: 
 http://openjdk.java.net/jeps/248 •https://speakerdeck.com/cguntur/java-garbage-collection-basics 7 Java 9 https://docs.oracle.com/javase/9/gctuning/garbage-first-garbage-collector.htm
  6. @CGuntur Version String Scheme •Scheme in Java 9 is $MAJOR.$MINOR.$SECURITY_PATCH

    •Replaces confusing mix of version and build numbers •Deemed temporary, changes in future versions •JEP 223 - Version-String Scheme:
 http://openjdk.java.net/jeps/223 •https://mreinhold.org/blog/forward-faster 8 Java 9
  7. @CGuntur JShell - Java REPL •Read-Eval-Print-Loop for a transcript evaluation

    •Great teaching tool •Originally targeted for Java 7 •Built on JShell API •JEP 222 - jshell - The Java Shell: 
 http://openjdk.java.net/jeps/222 9 Java 9 http://cr.openjdk.java.net/~rfield/tutorial/JShellTutorial.html
  8. @CGuntur Java Platform Modularity System (1) •Reduce the large and

    growing java package size •Also aims to remove/deprecate vestigial packages •Allows splitting the JDK in smaller units (modules) •Root module called java.base •Dependencies packaged as .jmod files •Module path to replace classpath 10 Java 9
  9. @CGuntur Java Platform Modularity System (2) • Java 9 itself

    is a modular system • Restructures JDK and JRE runtime images - as modules • No more rt.jar and tools.jar in libs • Enables Compact Profiles: 
 http://openjdk.java.net/jeps/161 • jlink responsible for assembly and optimizing modules • jlink produces custom runtime images 12 Java 9
  10. @CGuntur Java Platform Modularity System (3) JPMS (JSR 376): 


    http://openjdk.java.net/projects/jigsaw/spec/ JEP 261 - Module System: 
 http://openjdk.java.net/jeps/261 JEP 200 - The Modular JDK: 
 http://openjdk.java.net/jeps/200 JEP 220 - Modular Run-Time Images: 
 http://openjdk.java.net/jeps/220 JEP 260 - Encapsulate Internal APIs: 
 http://openjdk.java.net/jeps/260 13 Java 9
  11. @CGuntur Other Important enhancements •java.util.Optional - new methods added •java.util.stream.Stream

    - new methods added •java.util.concurrent.* - reactive and futures •Compact Strings - major fixes to compressed strings •Deprecation - added forRemoval & since attributes •Compiler - new flags to compile (--release) 14 Java 9
  12. @CGuntur Java 10 • Released: Mar. 2018 • First release

    in the 6-month release model • Fewer features and enhancements • Marked as a feature-release, not LTS • https://openjdk.java.net/projects/jdk/10/ 16
  13. @CGuntur Local Variable Type Inference (1) •Introduction of var as

    a variable type •Examples: ✤ var list = new ArrayList<String>();// infers ArrayList<String> ✤ var stream = list.stream(); // infers Stream<String> •Requires initialization of the variable •JEP 286 - Local-variable Type Inference:
 http://openjdk.java.net/jeps/286 17 Java 10
  14. @CGuntur Local Variable Type Inference (2) •Incorrect Examples: ✤var x;

    // cannot infer type for local ✤var f = () -> { }; // cannot infer type for local ✤var g = null; // cannot infer type for local ✤var k = { 1 , 2 }; // cannot infer type for local ✤(var x, var y) -> x.process(y) // not supported 18 Java 10 https://openjdk.java.net/projects/amber/LVTIstyle.html
  15. @CGuntur Application Class-Data Sharing •Improves startup and memory footprint •Extends

    existing CDS (JDK 5) to application classes •Allows loading to custom class loaders as well •Use -XX:+UseAppCDS to enable Application CDS •JEP 310 - Application Class-Data Sharing:
 http://openjdk.java.net/jeps/310 19 Java 10
  16. @CGuntur Experimental Java-Based JIT Compiler •Enables Graal Ahead-of-time JIT Compiler

    •First step for Project Metropolis •Extends the compiler via a JVM Compiler Interface •Use with -XX:+UseJVMCICompiler to enable •JEP 317 - Experimental Java-Based JIT Compiler:
 http://openjdk.java.net/jeps/317 20 Java 10 Metropolis: http://mail.openjdk.java.net/pipermail/announce/2017-September/000233.html
  17. @CGuntur Time-Based Release Versioning • New scheme: $FEATURE.$INTERIM.$UPDATE.$PATCH • Also

    added a java.version.date System property • Make it easy for a developer to figure out how old a release is • JEP 322 - Time-Based Release Versioning:
 http://openjdk.java.net/jeps/322 21 Java 10
  18. @CGuntur Other Features • JEP-296: Consolidate the JDK Forest into

    a Single Repository • JEP-304: Garbage-Collector Interface • JEP-307: Parallel Full GC for G1 • JEP-312: Thread-Local Handshakes • JEP-313: Remove the Native-Header Generation Tool (javah) • JEP-314: Additional Unicode Language-Tag Extensions • JEP-316: Heap Allocation on Alternative Memory Devices • JEP-319: Root Certificates 22 Java 10
  19. @CGuntur Java 11 •Released: Sep. 2018 •Marked as Long Term

    Support release, not FR •https://openjdk.java.net/projects/jdk/11/ 24
  20. @CGuntur Local-Variable Syntax for Lambda Parameters •Fixes issues with var

    usage in lambda parameters •Great addition for annotating params in lambdas •Examples: ✤ (var x, var y) -> x.process(y) // Works in Java 11 ✤ (@Nonnull var x, @Nullable var y) -> x.process(y) •JEP 323 - Local-Variable Syntax for Lambda Parameters:
 http://openjdk.java.net/jeps/323 25 Java 11
  21. @CGuntur Launch Single-File Source-Code Programs •Enables launching a single file

    Java program •Automatically compiles and runs Java file •Example: java HelloWorld.java (no need for javac) •Great tool for students and new beginners •JEP 330 - Launch Single-File Source-Code Programs:
 http://openjdk.java.net/jeps/330 26 Java 11
  22. @CGuntur Remove the Java EE and CORBA Modules •Removes Java

    EE & CORBA modules deprecated in Java 9 •Source code deleted from OpenJDK repository •Binaries do not include these deleted modules •Related to the separation of Java SE and Jakarta EE •JEP 320 - Remove the Java EE and CORBA Modules:
 http://openjdk.java.net/jeps/320 27 Java 11
  23. @CGuntur Epsilon Garbage Collector •Experimental No-Op memory allocator without any

    GC •Very useful for: ✤ Performance testing ✤ Memory pressure testing ✤ Extremely short-lived jobs ✤ Other deeper JVM development •JEP 318 - Epsilon: A No-Op Garbage Collector:
 http://openjdk.java.net/jeps/318 28 Java 11 E
  24. @CGuntur Z Garbage Collector •Experimental Low latency scalable garbage collector

    •Main features: ✤ Guaranteed pause times (10ms) ✤ Handles range of small (few MB) to very large memory (TBs) ✤ Foundation for future GC features and optimizations ✤ Concurrent, single-generation, region-based, NUMA-aware, compacting collector •JEP 333 - ZGC: A Scalable Low-Latency Garbage Collector:
 http://openjdk.java.net/jeps/333 29 Java 11 E
  25. @CGuntur Other Features (1) •JEP-181: Nest-Based Access Control •JEP-309: Dynamic

    Class-File Constants •JEP-315: Improve Aarch64 Intrinsics •JEP-321: HTTP Client (Standard) •JEP-324: Key Agreement with Curve25519 and Curve448 •JEP-327: Unicode 10 30 Java 11
  26. @CGuntur Other Features (2) •JEP-328: Flight Recorder •JEP-329: ChaCha20 and

    Poly1305 Cryptographic Algorithms •JEP-331: Low-Overhead Heap Profiling •JEP-332: Transport Layer Security (TLS) 1.3 •JEP-335: Deprecate the Nashorn JavaScript Engine •JEP-336: Deprecate the Pack200 Tools and API 31 Java 11
  27. @CGuntur Java 12 •Released: Mar. 2019 •Marked as a feature-release,

    not LTS •https://openjdk.java.net/projects/jdk/12/ 33
  28. @CGuntur Switch Expressions (Preview) •Preview for switch used as statement

    or expression • JEP 325 - Switch Expressions (Preview):
 http://openjdk.java.net/jeps/325 34 Java 12 P —> Q3
  29. @CGuntur Compact Number Formatting 
 • JDK-8188147 - Compact Number

    Formatting support:
 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8188147 35 Java 12 ~ 76.1K impressions & 2.01 thousand followers
  30. @CGuntur Shenandoah Garbage Collector •Experimental Tiny & consistent pause-time garbage

    collector •Main features: ✤ Adds an indirection pointer to every Java object ✤ Concurrent marking and compacting ✤ Optimized to never interrupt the running program ✤ Pause Java threads only to scan thread stacks to find & update object graph • JEP 189 - Shenandoah: A Low-Pause-Time Garbage Collector:
 http://openjdk.java.net/jeps/189 36 Java 12 E
  31. @CGuntur Microbenchmark Suite •Based on the Java Microbenchmark Harness (JMH)

    •Eases the addition, build and running of new benchmarks •Targeted for continuous performance testing •JEP 230 - Microbenchmark Suite:
 http://openjdk.java.net/jeps/230 37 Java 12
  32. @CGuntur Other Features •JEP-350: Java Constants API •JEP-340: One AArch64

    Port, Not Two •JEP-341: Default CDS Archives •JEP-344: Abortable Mixed Collections for G1 •JEP-346: Promptly Return Unused Committed Memory from G1 38 Java 12
  33. @CGuntur Java 13 •Released: Sep. 2019 •Marked as a feature-release,

    not LTS •https://openjdk.java.net/projects/jdk/13/ 40
  34. @CGuntur Dynamic CDS Archives •Extends AppCDS to archive at application

    exit •Further speeds up startup times •CDS and AppCDS were static, Dynamic CDS is an addition •Use -XX:ArchiveClassesAtExit=my.jsa - to enable
 Use -XX:SharedArchiveFile=my.jsa - to load •JEP 350 - Dynamic CDS Archives:
 http://openjdk.java.net/jeps/350 41 Java 13
  35. @CGuntur Switch Expressions (Preview) •2nd Preview for switch used as

    statement or expression 
 • JEP 354 - Switch Expressions (Preview):
 http://openjdk.java.net/jeps/354 42 Java 13 P —> Q3
  36. @CGuntur Text Blocks (Preview) • Preview for multi-line text blocks

    
 • JEP 355 - Text Blocks (Preview):
 http://openjdk.java.net/jeps/355 43 Java 13 P
  37. @CGuntur Java 14 • Released: Mar. 2020 • Marked as

    a feature-release, not LTS • Many new and exciting features !!! • https://openjdk.java.net/projects/jdk/14/ 46
  38. @CGuntur Pattern Matching for instanceof (Preview) •Replaces the need to

    cast once instance is confirmed •Example: if (obj instanceof String s) {
 // can use s here
 } else {
 // can't use s here
 } •JEP 305 - Pattern matching for instanceof (Preview):
 http://openjdk.java.net/jeps/305 47 Java 14 P
  39. @CGuntur Helpful NullPointerExceptions • Offer helpful information about the premature

    termination of a program • Example: a.b.c.i = 99; • Results in: 
 Exception in thread “main" java.lang.NullPointerException: Cannot read field "c" because "a.b" is null at Prog.main(Prog.java:5) • JEP 358 - Helpful NullPointerExceptions:
 http://openjdk.java.net/jeps/358 48 Java 14 P
  40. @CGuntur Algebraic Data Types - Records • Introduction of algebraic

    data types into Java, with records • Immutable data objects with built in constructors and accessors. record Range(int lo, int hi) { public Range { if (lo > hi) /* referring here to the implicit constructor parameters */ throw new IllegalArgumentException(String.format("(%d,%d)", lo, hi)); } } • JEP 359 - Records (Preview):
 https://openjdk.java.net/jeps/359 49 Java 14 P