© Copyright Azul Systems 2017
© Copyright Azul Systems 2015
@speakjava
55 New Features
In JDK 9
Simon Ritter
Deputy CTO, Azul Systems
1
© Copyright Azul Systems 2017
Major Features
© Copyright Azul Systems 2017
Modularity/Jigsaw
 Standard class libraries modularised (JEP 220)
– rt.jar now 85 modules
 Most internal APIs now encapsulated (JEP 260)
– Some can be used with command line option
– sun.misc.Unsafe
 Modular source code (JEP 201)
– JDK source code re-organised to support modules
– Not the module system
3
© Copyright Azul Systems 2017
jlink: The Java Linker (JEP 282)
4
Modular run-time
image
…confbin
jlink
$ jlink --modulepath $JDKMODS 
--addmods java.base –output myimage
$ myimage/bin/java –listmods
java.base@9.0
© Copyright Azul Systems 2017
jlink: The Java Linker (JEP 282)
$ jlink --modulepath $JDKMODS:$MYMODS 
--addmods com.azul.app –output myimage
$ myimage/bin/java –listmods
java.base@9.0
java.logging@9.0
java.sql@9.0
java.xml@9.0
com.azul.app@1.0
com.azul.zoop@1.0
com.azul.zeta@1.0
Version numbering for
information purposes only
“It is not a goal of the module
system to solve the version-
selection problem”
© Copyright Azul Systems 2017
Factory Methods For Collections (JEP 269)
 Static factory methods on List, Set and Map interfaces
– Create compact, immutable instances
– 0 to 10 element overloaded versions
6
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
set = Collections.unmodifiableSet(set);
Set<String> set = Set.of("a", "b", "c");
© Copyright Azul Systems 2017
Stream Enhancements
 dropWhile()/takeWhile()
– Like skip/limit but uses Predicate rather than number
 Improved iterate
– Enables a stream to be more like a for loop
 Parallel Files.lines()
– Memory mapped, divided on line break boundary
 Stream from Optional
– Stream of zero or one elements
7
© Copyright Azul Systems 2017
Multi-Release Jar Files (JEP 238)
 Multiple Java release-specific class files in a single archive
 Enhance jar tool to create multi-release files
 Support multi-release jar files in the JRE
– Classloaders
– JarFile API
 Enhance other tools
– javac, javap, jdeps, etc.
 Also, modular jar files
8
© Copyright Azul Systems 2017
REPL: jshell (JEP 222)
 Read-Eval-Print Loop
– Simple prototyping
9
© Copyright Azul Systems 2017
Concurrency Updates (JEP 266)
 Reactive streams publish-subscribe framework
 Asynchronous, non-blocking
 Flow
– Publisher, Subscriber, Processor, Subscription
 SubmissionPublisher utility class
– Asynchronously issues items to current subscribers
– Implements Flow.Processor
10
© Copyright Azul Systems 2017
Concurrency Updates (JEP 266)
 CompletableFuture additions
– Delays and timeouts
– Better support for sub-classing
– New utility methods
 minimalCompletionStage
 failedStage
 newIncompleteFuture
 failedFuture
11
© Copyright Azul Systems 2017
Enhanced Deprecation (JEP 277)
 We have @deprecated and @Deprecated
– Used to cover too many situations
 New methods in Deprecated annotation
– boolean forRemoval()
 Will this ever be removed?
– String since()
 JDK Version when this was deprecated
 Several @Deprecated tags added
– java.awt.Component.{show(),hide()} removed
12
© Copyright Azul Systems 2017
Milling Project Coin (JEP 213)
 Underscore no longer valid as identifier
– Ready for use in Lambdas
 Private methods in interfaces
– Multiple inheritance of behaviour makes this logical
 Effectively final variables in try-with-resources
– Variables from outside try block
 Allow @SafeVarargs on private instance methods
– In addition to constructors, final and static methods
 Diamond operator with anonymous classes
– Extending type inference further
13
© Copyright Azul Systems 2017
Standards
© Copyright Azul Systems 2017
Updating To Relevant Standards
 Unicode 7.0/8.0 (JEP 227/267)
– 7.0: 2,834 new characters
– 8.0: 7,716 new characters
 PKCS12 key stores by default (JEP 229)
– Move from JKS to PKCS12
 HTML5 javadocs (JEP 224)
– Flashier documentation
 SHA 3 hash algorithms (JEP 287)
– Keeping ahead of the hackers
15
}seriously!
© Copyright Azul Systems 2017
Smaller Features
 UTF-8 property files (JEP 226)
– ResourceBundle API updated to load these files
 DRBG-Based SecureRandom implementations (JEP 273)
– Deterministic Random Bit Generator
 XML Catalog API (JEP 268)
– Supports OASIS XML catalog API v1.1
– For use with JAXP
16
© Copyright Azul Systems 2017
Inside The JVM
© Copyright Azul Systems 2017
Default Collector: G1 (JEP 248)
 G1 now mature in development
 Designed as low-pause collector
 Concurrent class unloading (JEP 156) JDK8u40
– Useful enhancement to improve G1
 Still falls back to full compacting collection
– Pause times proportional to heap size
– Use Zing from Azul for truly pauseless
18
© Copyright Azul Systems 2017
Better String Performance
 Compact strings (JEP 254)
– Improve the space efficiency of the String class
– Not using alternative encodings
 Store interned strings in CDS archive (JEP 250)
– Share String and char[] objects between JVMs
 Indify String concatenation (JEP 280)
– Change from static String-concatenation bytecode
sequence to invokedynamic
– Allow future performance improvements
19
© Copyright Azul Systems 2017
Marlin Graphics Renderer (JEP 265)
 Replaces Pisces open-source renderer
– Comparable performance to closed-source Ductus
20
© Copyright Azul Systems 2017
Smaller Features
 Improve contended locking (JEP 143)
– Field reordering/cache line alignment
 Leverage CPU instructions for GHASH and RSA (JEP 246)
– 34-150x better performance (for certain tests)
 Update JavaFX to newer version of GStreamer (JEP 257)
– Media class
– Better security, stability and performance
21
© Copyright Azul Systems 2017
Smaller Features
 Segmented Code Cache (JEP 197)
– Separate non-method, profiled and non-profiled code
 Unified JVM logging (JEP 158)
– Common logging system for all components of JVM
 Unified GC logging (JEP 271)
– Re-implement GC logging using unified JVM logging
22
© Copyright Azul Systems 2017
Specialised
© Copyright Azul Systems 2017
Spin-Wait Hints (JEP 285)
 Proposed by Azul
– We rock!
 A new method for Thread class
– onSpinWait()
 Enables the x86 PAUSE instruction to be used from Java
code
– If available
– Ignored otherwise
– Improved performance for things like Disruptor
24
© Copyright Azul Systems 2017
Variable Handles (JEP 193)
 Replacement for parts of sun.misc.Unsafe
 Fence operations
– Fine grained memory control
– Atomic operations on object fields and array elements
 VarHandle
– compareAndExchange(), compareAndSet()
– getAndAdd(), getAndSet()
– acquireFence(), releaseFence()
25
© Copyright Azul Systems 2017
Enhanced Method Handles (JEP 274)
 Support for
– loops
– try/finally blocks
 Better argument handling
– Spreading
– Collection
– Folding
 More lookup functions
– Non-abstract methods in interfaces, classes
26
© Copyright Azul Systems 2017
Smaller Features
 Compiler control (JEP 165)
– Control of C1/C2 JIT, not javac
– Directive file
– Runtime changes via jcmd
 Process API updates (JEP 102)
– Native process (Process/ProcessHandle)
– More information: pid, arguments, start time, CPU usage,
name
– Control subject to security manager permissions
27
© Copyright Azul Systems 2017
Housekeeping
© Copyright Azul Systems 2017
New Version String Format (JEP 223)
 Old
– Limited update release/Critical patch update (CPU)
– JDK 8u121 or jdk1.8.0_u121
– Which has more patches, JDK 7u55 or JDK 7u60?
 New
– JDK $MAJOR.$MINOR.$SECURITY.$PATCH
– Easy to understand by humans and apps
– Semantic versioning
29
© Copyright Azul Systems 2017
JDK/JRE File Structure (JEP 220)
30
bin
Pre-JDK 9 JDK 9
lib
tools.jar
jre
bin
rt.jar
lib
libconfbin
jre directory
tools.jar
rt.jar
© Copyright Azul Systems 2017
Smaller Features
 Searchable API documentation (JEP 225)
– Finally! Java API docs enter the 21st century
 Annotations pipeline 2.0 (JEP 217)
– Repeating, type and Lambda annotations in JDK 8
– Redesign of javac annotation pipeline
 Parser API for Nashorn (JEP 236)
– API for Nashorn abstract tree syntax
31
© Copyright Azul Systems 2017
General Clean Up
 Disable SHA-1 certificates (JEP 288)
– Mostly
 In some situations SHA-1 certs. will still be accepted
 Deprecate the Applet API (JEP 289)
– Not many people still use this
32
© Copyright Azul Systems 2017
Removed From JDK 9
 Six deprecated APIs (JEP 162)
– ActionListeners in Pack200 and LogManager
 JRE version selection command line option (JEP 231)
– -version: no longer accepted
 Demos and samples (JEP 298)
– Out-of-date, unmaintained
33
© Copyright Azul Systems 2017
Removed From JDK 9
 JVM TI hprof agent (JEP 240)
– Only ever intended as a demo of JVM TI
– Useful features now in other tools (like jmap)
 Remove the jhat tool (JEP 241)
– Experimental tool added in JDK 6
– Unsupported
– Better heap visualisation tools available
34
© Copyright Azul Systems 2017
Removed GC Options (JEP 214)
 Deprecated in JDK 8 (JEP 173)
35
DefNew + CMS : -XX:-UseParNewGC -XX:+UseConcMarkSweepGC
ParNew + SerialOld : -XX:+UseParNewGC
ParNew + iCMS : -Xincgc
ParNew + iCMS : -XX:+CMSIncrementalMode -XX:+UseConcMarkSweepGC
DefNew + iCMS : -XX:+CMSIncrementalMode -XX:+UseConcMarkSweepGC
-XX:-UseParNewGC
CMS foreground : -XX:+UseCMSCompactAtFullCollection
CMS foreground : -XX:+CMSFullGCsBeforeCompaction
CMS foreground : -XX:+UseCMSCollectionPassing
© Copyright Azul Systems 2017
Incubator Modules (JEP 11)
 Develop APIs without making them part of the standard
– At least not straight away
 Allow developers to “kick the tyres”
– Not always possible to get a new API right first time
 Move from incubator to full module
– Becomes part of the standard
 JDK 9 only has one incubator: HTTP/2 (JEP 110)
 Some concerns about fragmentation
--do-not-resolve-by-default
36
© Copyright Azul Systems 2017
Summary
© Copyright Azul Systems 2017
JDK 9
 Big new feature is modularity
– Covers numerous different areas
– Modules, jink, jmods, etc.
 Smaller developer features
– New APIs for streams
– Reactive API
– REPL/jshell
 Many smaller performance/standards features
 Time to start testing, if you’re not already
38
© Copyright Azul Systems 2017
Zulu Java
 Azul’s binary distribution of OpenJDK
– Passes all TCK tests
– Multi-platform (Windows, Linux, Mac)
– FREE!
 Happy to sell you support, including older versions
 JDK 6, 7, 8 and 9 (Early Access)
39
www.zulu.org/download
© Copyright Azul Systems 2017
© Copyright Azul Systems 2015
@speakjava
Questions
Simon Ritter
Deputy CTO, Azul Systems
40

55 New Features in JDK 9

  • 1.
    © Copyright AzulSystems 2017 © Copyright Azul Systems 2015 @speakjava 55 New Features In JDK 9 Simon Ritter Deputy CTO, Azul Systems 1
  • 2.
    © Copyright AzulSystems 2017 Major Features
  • 3.
    © Copyright AzulSystems 2017 Modularity/Jigsaw  Standard class libraries modularised (JEP 220) – rt.jar now 85 modules  Most internal APIs now encapsulated (JEP 260) – Some can be used with command line option – sun.misc.Unsafe  Modular source code (JEP 201) – JDK source code re-organised to support modules – Not the module system 3
  • 4.
    © Copyright AzulSystems 2017 jlink: The Java Linker (JEP 282) 4 Modular run-time image …confbin jlink $ jlink --modulepath $JDKMODS --addmods java.base –output myimage $ myimage/bin/java –listmods [email protected]
  • 5.
    © Copyright AzulSystems 2017 jlink: The Java Linker (JEP 282) $ jlink --modulepath $JDKMODS:$MYMODS --addmods com.azul.app –output myimage $ myimage/bin/java –listmods [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] Version numbering for information purposes only “It is not a goal of the module system to solve the version- selection problem”
  • 6.
    © Copyright AzulSystems 2017 Factory Methods For Collections (JEP 269)  Static factory methods on List, Set and Map interfaces – Create compact, immutable instances – 0 to 10 element overloaded versions 6 Set<String> set = new HashSet<>(); set.add("a"); set.add("b"); set.add("c"); set = Collections.unmodifiableSet(set); Set<String> set = Set.of("a", "b", "c");
  • 7.
    © Copyright AzulSystems 2017 Stream Enhancements  dropWhile()/takeWhile() – Like skip/limit but uses Predicate rather than number  Improved iterate – Enables a stream to be more like a for loop  Parallel Files.lines() – Memory mapped, divided on line break boundary  Stream from Optional – Stream of zero or one elements 7
  • 8.
    © Copyright AzulSystems 2017 Multi-Release Jar Files (JEP 238)  Multiple Java release-specific class files in a single archive  Enhance jar tool to create multi-release files  Support multi-release jar files in the JRE – Classloaders – JarFile API  Enhance other tools – javac, javap, jdeps, etc.  Also, modular jar files 8
  • 9.
    © Copyright AzulSystems 2017 REPL: jshell (JEP 222)  Read-Eval-Print Loop – Simple prototyping 9
  • 10.
    © Copyright AzulSystems 2017 Concurrency Updates (JEP 266)  Reactive streams publish-subscribe framework  Asynchronous, non-blocking  Flow – Publisher, Subscriber, Processor, Subscription  SubmissionPublisher utility class – Asynchronously issues items to current subscribers – Implements Flow.Processor 10
  • 11.
    © Copyright AzulSystems 2017 Concurrency Updates (JEP 266)  CompletableFuture additions – Delays and timeouts – Better support for sub-classing – New utility methods  minimalCompletionStage  failedStage  newIncompleteFuture  failedFuture 11
  • 12.
    © Copyright AzulSystems 2017 Enhanced Deprecation (JEP 277)  We have @deprecated and @Deprecated – Used to cover too many situations  New methods in Deprecated annotation – boolean forRemoval()  Will this ever be removed? – String since()  JDK Version when this was deprecated  Several @Deprecated tags added – java.awt.Component.{show(),hide()} removed 12
  • 13.
    © Copyright AzulSystems 2017 Milling Project Coin (JEP 213)  Underscore no longer valid as identifier – Ready for use in Lambdas  Private methods in interfaces – Multiple inheritance of behaviour makes this logical  Effectively final variables in try-with-resources – Variables from outside try block  Allow @SafeVarargs on private instance methods – In addition to constructors, final and static methods  Diamond operator with anonymous classes – Extending type inference further 13
  • 14.
    © Copyright AzulSystems 2017 Standards
  • 15.
    © Copyright AzulSystems 2017 Updating To Relevant Standards  Unicode 7.0/8.0 (JEP 227/267) – 7.0: 2,834 new characters – 8.0: 7,716 new characters  PKCS12 key stores by default (JEP 229) – Move from JKS to PKCS12  HTML5 javadocs (JEP 224) – Flashier documentation  SHA 3 hash algorithms (JEP 287) – Keeping ahead of the hackers 15 }seriously!
  • 16.
    © Copyright AzulSystems 2017 Smaller Features  UTF-8 property files (JEP 226) – ResourceBundle API updated to load these files  DRBG-Based SecureRandom implementations (JEP 273) – Deterministic Random Bit Generator  XML Catalog API (JEP 268) – Supports OASIS XML catalog API v1.1 – For use with JAXP 16
  • 17.
    © Copyright AzulSystems 2017 Inside The JVM
  • 18.
    © Copyright AzulSystems 2017 Default Collector: G1 (JEP 248)  G1 now mature in development  Designed as low-pause collector  Concurrent class unloading (JEP 156) JDK8u40 – Useful enhancement to improve G1  Still falls back to full compacting collection – Pause times proportional to heap size – Use Zing from Azul for truly pauseless 18
  • 19.
    © Copyright AzulSystems 2017 Better String Performance  Compact strings (JEP 254) – Improve the space efficiency of the String class – Not using alternative encodings  Store interned strings in CDS archive (JEP 250) – Share String and char[] objects between JVMs  Indify String concatenation (JEP 280) – Change from static String-concatenation bytecode sequence to invokedynamic – Allow future performance improvements 19
  • 20.
    © Copyright AzulSystems 2017 Marlin Graphics Renderer (JEP 265)  Replaces Pisces open-source renderer – Comparable performance to closed-source Ductus 20
  • 21.
    © Copyright AzulSystems 2017 Smaller Features  Improve contended locking (JEP 143) – Field reordering/cache line alignment  Leverage CPU instructions for GHASH and RSA (JEP 246) – 34-150x better performance (for certain tests)  Update JavaFX to newer version of GStreamer (JEP 257) – Media class – Better security, stability and performance 21
  • 22.
    © Copyright AzulSystems 2017 Smaller Features  Segmented Code Cache (JEP 197) – Separate non-method, profiled and non-profiled code  Unified JVM logging (JEP 158) – Common logging system for all components of JVM  Unified GC logging (JEP 271) – Re-implement GC logging using unified JVM logging 22
  • 23.
    © Copyright AzulSystems 2017 Specialised
  • 24.
    © Copyright AzulSystems 2017 Spin-Wait Hints (JEP 285)  Proposed by Azul – We rock!  A new method for Thread class – onSpinWait()  Enables the x86 PAUSE instruction to be used from Java code – If available – Ignored otherwise – Improved performance for things like Disruptor 24
  • 25.
    © Copyright AzulSystems 2017 Variable Handles (JEP 193)  Replacement for parts of sun.misc.Unsafe  Fence operations – Fine grained memory control – Atomic operations on object fields and array elements  VarHandle – compareAndExchange(), compareAndSet() – getAndAdd(), getAndSet() – acquireFence(), releaseFence() 25
  • 26.
    © Copyright AzulSystems 2017 Enhanced Method Handles (JEP 274)  Support for – loops – try/finally blocks  Better argument handling – Spreading – Collection – Folding  More lookup functions – Non-abstract methods in interfaces, classes 26
  • 27.
    © Copyright AzulSystems 2017 Smaller Features  Compiler control (JEP 165) – Control of C1/C2 JIT, not javac – Directive file – Runtime changes via jcmd  Process API updates (JEP 102) – Native process (Process/ProcessHandle) – More information: pid, arguments, start time, CPU usage, name – Control subject to security manager permissions 27
  • 28.
    © Copyright AzulSystems 2017 Housekeeping
  • 29.
    © Copyright AzulSystems 2017 New Version String Format (JEP 223)  Old – Limited update release/Critical patch update (CPU) – JDK 8u121 or jdk1.8.0_u121 – Which has more patches, JDK 7u55 or JDK 7u60?  New – JDK $MAJOR.$MINOR.$SECURITY.$PATCH – Easy to understand by humans and apps – Semantic versioning 29
  • 30.
    © Copyright AzulSystems 2017 JDK/JRE File Structure (JEP 220) 30 bin Pre-JDK 9 JDK 9 lib tools.jar jre bin rt.jar lib libconfbin jre directory tools.jar rt.jar
  • 31.
    © Copyright AzulSystems 2017 Smaller Features  Searchable API documentation (JEP 225) – Finally! Java API docs enter the 21st century  Annotations pipeline 2.0 (JEP 217) – Repeating, type and Lambda annotations in JDK 8 – Redesign of javac annotation pipeline  Parser API for Nashorn (JEP 236) – API for Nashorn abstract tree syntax 31
  • 32.
    © Copyright AzulSystems 2017 General Clean Up  Disable SHA-1 certificates (JEP 288) – Mostly  In some situations SHA-1 certs. will still be accepted  Deprecate the Applet API (JEP 289) – Not many people still use this 32
  • 33.
    © Copyright AzulSystems 2017 Removed From JDK 9  Six deprecated APIs (JEP 162) – ActionListeners in Pack200 and LogManager  JRE version selection command line option (JEP 231) – -version: no longer accepted  Demos and samples (JEP 298) – Out-of-date, unmaintained 33
  • 34.
    © Copyright AzulSystems 2017 Removed From JDK 9  JVM TI hprof agent (JEP 240) – Only ever intended as a demo of JVM TI – Useful features now in other tools (like jmap)  Remove the jhat tool (JEP 241) – Experimental tool added in JDK 6 – Unsupported – Better heap visualisation tools available 34
  • 35.
    © Copyright AzulSystems 2017 Removed GC Options (JEP 214)  Deprecated in JDK 8 (JEP 173) 35 DefNew + CMS : -XX:-UseParNewGC -XX:+UseConcMarkSweepGC ParNew + SerialOld : -XX:+UseParNewGC ParNew + iCMS : -Xincgc ParNew + iCMS : -XX:+CMSIncrementalMode -XX:+UseConcMarkSweepGC DefNew + iCMS : -XX:+CMSIncrementalMode -XX:+UseConcMarkSweepGC -XX:-UseParNewGC CMS foreground : -XX:+UseCMSCompactAtFullCollection CMS foreground : -XX:+CMSFullGCsBeforeCompaction CMS foreground : -XX:+UseCMSCollectionPassing
  • 36.
    © Copyright AzulSystems 2017 Incubator Modules (JEP 11)  Develop APIs without making them part of the standard – At least not straight away  Allow developers to “kick the tyres” – Not always possible to get a new API right first time  Move from incubator to full module – Becomes part of the standard  JDK 9 only has one incubator: HTTP/2 (JEP 110)  Some concerns about fragmentation --do-not-resolve-by-default 36
  • 37.
    © Copyright AzulSystems 2017 Summary
  • 38.
    © Copyright AzulSystems 2017 JDK 9  Big new feature is modularity – Covers numerous different areas – Modules, jink, jmods, etc.  Smaller developer features – New APIs for streams – Reactive API – REPL/jshell  Many smaller performance/standards features  Time to start testing, if you’re not already 38
  • 39.
    © Copyright AzulSystems 2017 Zulu Java  Azul’s binary distribution of OpenJDK – Passes all TCK tests – Multi-platform (Windows, Linux, Mac) – FREE!  Happy to sell you support, including older versions  JDK 6, 7, 8 and 9 (Early Access) 39 www.zulu.org/download
  • 40.
    © Copyright AzulSystems 2017 © Copyright Azul Systems 2015 @speakjava Questions Simon Ritter Deputy CTO, Azul Systems 40

Editor's Notes

  • #13 forRemoval - Interesting. Tri-state (i.e. it may not be present on the annotation).
  • #16 Unicode 7: Lots of emojis, the Ruble symbol and Manat from Azerbaijan Unicode 8: Cherokee (lower case) some African languages and more emojis
  • #17 XML catalog is a document describing a mapping between extenal entity references and locallly cached equivalents. (Useful for things like DTDs)
  • #19 Concurrent class unloading means not having to do a full GC to unload classes Making G1 default may affect thruput Higher resource requirements Reasons to
  • #20 CDS = Class Data Sharing
  • #23 Segmented code cache to improve performance and allow future developments (Sumatra and the use of GPUs)
  • #27  MethodHandles utility class loop, countedLoop, whileLoop, tryFinally static methods spreading - arg array to individual args Collection - args to arg array Folding - Pre-prasing of arguments