java 9 preview

55
What to expect from Java 9? Ivan Krylov June 9, 2016 1 @JohnWings #GeekOutEE

Upload: ivan-krylov

Post on 16-Feb-2017

327 views

Category:

Presentations & Public Speaking


1 download

TRANSCRIPT

Page 1: Java 9 preview

What to expect from Java 9?

Ivan KrylovJune 9, 2016

1

@JohnWings#GeekOutEE

Page 2: Java 9 preview

Why talking about it now?

• Less then 1 year till scheduled release

• Now is a good time to plan and prep for it

• I am from Azul Systems - maker of compliant JDKs

• Observing the process from aside, unbiased view on changes

• All sources for this talk are public

2

Page 3: Java 9 preview

Java 9 and community

3

Page 4: Java 9 preview

4

http://wiki.netbeans.org/InternalAPIsUnavailableInJava9

Page 5: Java 9 preview

5

Subject: module-info.java just causes problems Date: Wed, 4 May 2016 13:33:06 -0500 From: David M. Lloyd <[email protected]> To: jigsaw-dev <[email protected]>

Tools like Maven and JUnit are yet still having a difficult time coping with the oddball module-info.java file. Can we just drop this thing and let the layer provide metadata for the module? This way of defining module metadata is clearly causing trouble. Reference: all previous arguments from non-Oracle people over the last 5 years or so.

So far none of our software actually functions with Jigsaw, and the prospect is not improving. In the meantime the EG is alternately completely dead or in a state of we'll-register-your-issue-but-cannot-help-resolve-them mode. I'm highly concerned.

Concerns

Page 6: Java 9 preview

6

“There are only two kinds of languages: the ones people complain about and the ones nobody uses.”

Bjarne Stroustrup

Page 7: Java 9 preview

Java Timeline

JDK 6Dec 2006

JDK 7July 2011

JDK 8March 2014

JDK 9exp.

March 2017

JDK 6Nov 2012

JDK 7Apr

2015

JDK 8exp. Mar 2018

J2SE 1.4 Dec 2006

JDK 5Oct 2009

7

GA

EOL

Page 8: Java 9 preview

Java EOL & You?

EOL datepassed

Security vulnerabilities

keep appearing&

Sign Support contact

Adopt OpenJDK (Zulu, IcedTea,

homebrew builds)Updated to latest

JDK

8

Updates needed

Page 9: Java 9 preview

Java 9 schedule (tent.)Fe

atur

e co

mpl

ete

Zero

Bug

Bou

nce

Ram

pdow

n ph

ase

2Fin

al Re

lease

Can

dida

te

May

’16

All te

sts ru

nRa

mpd

own

Star

t

Gene

ral A

vaila

bility

Aug

’16

Sept

’16

Oct ’1

6

Dec

’16

Jan

’17

Mar

’17

9

Page 10: Java 9 preview

What (was) new in Java 8• Lambdas

• Method references

• Type annotations

• Repeated annotations • Interface a.k.a. default

methods

10

• Stream API

• Date Time API

• PermGen replacement (vendor specific)

• Nashorn, JavaScript Engine

• New tools (jdeps,jjs,..)

http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html

Page 11: Java 9 preview

How new features become part of Java standard?

11

Page 12: Java 9 preview

JEP process

12

Source: http://cr.openjdk.java.net/~mr/jep/jep-2.0-02.html

Page 13: Java 9 preview

JSR

Source: https://groups.google.com/forum/#!topic/java-social/InafCPMLLaA13

Page 14: Java 9 preview

Modules

14

Page 15: Java 9 preview

Modules

Packages

Classes

fields & methods

Interfaces

Abstract Classes

Code encapsulation

15

Page 16: Java 9 preview

Problems being addressed• Java Runtime keeps getting bigger and bigger

• Java 8 profiles 1, 2, 3 provide partial solutions

• Jar / Classpath Hell

• What depends on what ..

• Optional dependancies, transitive dependancies

• Lazy class loading and initialisation -> NoClassDefFoundError

• For code that escapes packages the visibility mechanism is poor - only public

• Classes from different packages “see” each other, even from different class loaders

• SecurityManager helps to protect, but it is not on by default16

Page 17: Java 9 preview

Jigsaw

JEP 162: Prepare for ModularizationJEP 200: The Modular JDKJEP 220: Modular Run-Time ImagesJEP 201: Modular Source CodeJEP 260: Encapsulate Most Internal APIsJEP 282: jlink: The Java Linker

JSR 376: Java Platform Module SystemJEP 261: Module System

ModularityJava Module

17

Page 18: Java 9 preview

Example 1s_module/module-info.java

module s_module { exports services; }

p_module/module-info.java

module p_module { requires s_module; }

s_module/services/LocProvider.java

package services; import java.lang.String;

public class LocProvider { public static String getLocation() { return "GeekoutEE 2016"; } }

p_module/presentations/ModulesDemo.java

package presentations; import services.LocProvider;

public class ModulesDemo { public static void main(java.lang.String[] argv) { System.out.println("I am at “ + LocProvider.getLocation()); } }

Module s_module

Modulep_module

18

Page 19: Java 9 preview

New params javac/java (1)• # Compile

• >javac -d target -modulesourcepath . s_module/services/LocProvider.java

• >javac -d target -modulepath target -modulesourcepath . p_module/presentations/ModulesDemo.java

• # Run

• >java -mp target -m p_module/presentations.ModulesDemo

19

Page 20: Java 9 preview

New parameters for javac/java (2)

20

• # Packaging

• jar --create --file=jars/s_module.jar -C target/s_module .

• jar --create --file=jars/p_module.jar --main-class=presentations/ModulesDemo -C target/p_module .

• # Run

• $j/bin/java -mp jars -m p_module

Reference: http://openjdk.java.net/projects/jigsaw/quick-start

Page 21: Java 9 preview

Example 2./langtools/src/jdk.compiler/share/classes/module-info.java

module jdk.compiler { requires public java.compiler;

exports com.sun.source.doctree; exports com.sun.source.tree; exports com.sun.source.util; exports com.sun.tools.javac; exports com.sun.tools.doclint to jdk.javadoc; exports com.sun.tools.javac.api to jdk.javadoc, jdk.jshell; exports com.sun.tools.javac.code to jdk.javadoc, jdk.jshell; exports com.sun.tools.javac.comp to jdk.javadoc, jdk.jshell; exports com.sun.tools.javac.file to jdk.jdeps, jdk.javadoc; exports com.sun.tools.javac.jvm to jdk.javadoc; exports com.sun.tools.javac.main to jdk.javadoc; exports com.sun.tools.javac.model to jdk.javadoc; exports com.sun.tools.javac.parser to jdk.jshell; exports com.sun.tools.javac.platform to jdk.javadoc; exports com.sun.tools.javac.tree to jdk.javadoc, jdk.jshell; exports com.sun.tools.javac.util to jdk.jdeps, jdk.javadoc, jdk.jshell;

uses javax.annotation.processing.Processor; uses com.sun.source.util.Plugin; uses com.sun.tools.javac.platform.PlatformProvider;

provides com.sun.tools.javac.platform.PlatformProvider with com.sun.tools.javac.platform.JDKPlatformProvider;

provides javax.tools.JavaCompiler with com.sun.tools.javac.api.JavacTool; }

META-INF/services

21

Page 22: Java 9 preview

Can modularised & non-modularised code co-exist?

• Whatever is in classpath - going into unnamed modules

• Unnamed modules can access all named modules (requires *) /See next slide for a special note/

• The reverse isn’t true - must specify requires unnamed or …

• jar file in -mp is being automatically converted to a module with a name matching the name of the jar file

• Therefore referred as automodules

• Provide transition path to jigsaw modules design

• Unnamed modules are being searched for types as a last option 22

Page 23: Java 9 preview

Unnamed modules can access all named modules

• Not so true since JDK9 build 118

• These modules are not accessible from unnamed modules:java.activation - java.annotations.common - java.corbajava.transaction - java.xml.bind - java.xml.ws

• One can still add visibility with a flag like `-addmods java.corba`

• Source: May 17th letter from Alan Bateman: http://mail.openjdk.java.net/pipermail/jdk9-dev/2016-May/004309.html

• More info: http://openjdk.java.net/jeps/26123

Page 24: Java 9 preview

Types of modules

• Named

• Those containing module-info.class

• Automatic

• jar files placed to the module path

• Unnamed

• Contains all types in the classpath

24

Page 25: Java 9 preview

25

jdeps -genmoduleinfo

cat /Users/ivan/test/modules/generated/glassfish.corba.omgapi/module-info.java module glassfish.corba.omgapi { requires public java.corba; requires public java.desktop; requires public java.rmi; exports com.sun.corba.ee.org.omg.CORBA; exports javax.rmi.CORBA; exports org.omg.CORBA; exports org.omg.CORBA.DynAnyPackage; exports org.omg.CORBA.ORBPackage; exports org.omg.CORBA.TSIdentificationPackage; exports org.omg.CORBA.TypeCodePackage; exports org.omg.CORBA.portable; exports org.omg.CORBA_2_3; exports org.omg.CORBA_2_3.portable; exports org.omg.CosNaming; exports org.omg.CosNaming.NamingContextExtPackage; exports org.omg.CosNaming.NamingContextPackage; exports org.omg.CosTSInteroperation; exports org.omg.CosTSPortability; exports org.omg.CosTransactions; exports org.omg.Dynamic; exports org.omg.DynamicAny; exports org.omg.DynamicAny.DynAnyFactoryPackage; exports org.omg.DynamicAny.DynAnyPackage; exports org.omg.IOP; exports org.omg.IOP.CodecFactoryPackage; exports org.omg.IOP.CodecPackage; exports org.omg.Messaging; exports org.omg.PortableInterceptor; exports org.omg.PortableInterceptor.ORBInitInfoPackage; exports org.omg.PortableServer; exports org.omg.PortableServer.CurrentPackage; exports org.omg.PortableServer.POAManagerPackage; exports org.omg.PortableServer.POAPackage; exports org.omg.SendingContext; exports org.omg.stub.java.rmi; }

jdeps

-genmoduleinfo

~/test/modules/generated/ glassfish-4.1.1/glassfish/modules/glassfish-corba-omgapi.jar

Page 26: Java 9 preview

26

jdeps -jdkinternalsglassfish-corba-orb.jar -> java.corba com.sun.corba.ee.impl.copyobject.OldReflectObjectCopierImpl (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.copyobject.OldReflectObjectCopierImpl$1 (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.encoding.BufferManagerWriteStream (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.IIOPInputStream (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.IIOPInputStream$1 (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.IIOPOutputStream (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.IIOPOutputStream$1 (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.ObjectStreamClass (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.ObjectStreamClass$1 (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.ObjectStreamField (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.io.ObjectStreamField$1 (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl$1 (glassfish-corba-orb.jar) -> com.sun.jndi.cosnaming.CNCtx JDK internal API (java.corba) com.sun.corba.ee.impl.util.JDKClassLoader (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba) com.sun.corba.ee.impl.util.JDKClassLoader$1 (glassfish-corba-orb.jar) -> sun.corba.Bridge JDK internal API (java.corba)

jdeps

-jdkinternals

glassfish/ modules/ glassfish-corba-orb.jar

Page 27: Java 9 preview

27

java -XaddExportsjava -XaddExports :java.base/sun.security.provider=ALL-UNNAMED, java.base/sun.security.pkcs=ALL-UNNAMED, java.base/sun.security.util=ALL-UNNAMED, java.base/sun.security.x509=ALL-UNNAMED, :

java -XaddReadsjava -XaddReads:java.management=testng

Page 28: Java 9 preview

28

• Consider an app with extensions

• The extension might require a different version of a module than loaded before

• The extension might require service providers

• Layer of modules encapsulates

• a module graph

• mapping from each module in that graph to a class loader

• Boot layer - created by VM at start time and suitable for most apps

• App can create a new layer - new universe of modules

• Stackable - package resolution starts with the app layer and goes down to the boot layer

Layers

Page 29: Java 9 preview

JDK9 EA

Modularity

Source: http://openjdk.java.net/projects/jigsaw/doc/jdk-modularization.html

29http://cr.openjdk.java.net/~mr/jigsaw/ea/module-summary.html

Page 30: Java 9 preview

More to discover

30

• Reflection. java.lang.reflect.Module class.

• Multirelease jar (Since b109. Bug 8132734)

• Packages with the same name possibly leading to NoClassDefFoundException

• Layers - new concept for classloaders

• New instruments for modules development

• <java9_jigsaw>/bin/jdeps -help

• IDE are now supporting modules

• Classloaders and ways for circular dependancies between modules

Page 31: Java 9 preview

Jigsaw - Unresolved issueshttp://openjdk.java.net/projects/jigsaw/spec/issues/

• Module declarations

• #ModuleNameSyntax · #CompileTimeDependences · #ModuleAnnotations

• Module artifacts

• #MultiModuleExecutableJARs · #MultiModuleJARs · #ReifiedModuleGraphs

• Module descriptors

• #StandardModuleAttributes

• Module graphs

• #CyclicDependences

• Reflection

• #ClassFilesAsResources · #ResourceEncapsulation · #ReflectiveAccessToNonExportedTypes · #ReflectionWithoutReadability

• Class loaders

• #AvoidConcealedPackageConflicts · #PlatformClassLoader

• Versioning

• #StaticLayerConfiguration · #MultipleModuleVersions · #VersionsInModuleNames · #VersionedDependences

31

Page 32: Java 9 preview

(My) takeaways on Java 9 modules• Purpose - explicit listing of dependancies

• OSGi compatible and complementary

• Will provide new optimisation paths

• Compatible with jar/cp

• Jigsaw - rough flight all way along, loosing features

• Lost ability to match versions 32

Page 33: Java 9 preview

Jigsaw - links• If you google it - discard all posts before 2014, probably even before 2015 too

• State of Jigsaw (March 8 2015)

• http://openjdk.java.net/projects/jigsaw/spec/sotms/

• JavaOne 2015 (also Devoxx BE)

• http://openjdk.java.net/projects/jigsaw/j1/

• Code was integrated in JDK9 EA build 111

• See also: http://blog.codefx.org/java/dev/features-project-jigsaw-java-9/

• http://blog.codefx.org/java/dev/javaone-2015-under-the-hood-of-project-jigsaw/33

Page 34: Java 9 preview

Syntax changes - Milling Project Coin• Private default methods

interface I { void a() { /*Common code*/ ; /*a’s specific code*/ } void b() { /*Common code*/ ; /*b’s specific code*/ } ?? - void c() { /*Common code*/ ; } }

34

interface II { private void foo_private(String s); // Error: private method must declare body. private abstract void foo_abstract(int i, int j); // Error: private & abstract: bad combo void foo_decl(int x); // OK. private I foo_with_body() { return null; } // OK. }

interface I { void a() { с(); /*a’s specific code*/ } void b() { с(); /*b’s specific code*/ } private void c() { /*Common code*/ ; } }

Page 35: Java 9 preview

Syntax changes - Milling Project Coin

• Effectively-final variables in try-with-resources expressions

35

public static void main(String... args) throws …{ FileReader f = new FileReader(“test.txt”); br =new BufferedReader(fr); try (br) { // do something } catch (Exception ex) { } }

public static void main(String... args) throws …{ FileReader f = new FileReader(“test.txt"); try (br =new BufferedReader(fr)) { // do something } catch (Exception ex) { } }

Page 36: Java 9 preview

Syntax changes - Milling Project Coin• @SafeVarargs in private methods

• (In Java 8 it was only final and static)

class VarargsFinalOnly { @SafeVarargs private void m(List<String>... args) { }}

36

Page 37: Java 9 preview

public class TypeInferrenceTest { Map<String, String> map = new HashMap<String, String>() { { map.put("key", "value"); } }; }

• Using diamond with anonymous classes when actual type may be deduced

public class TypeInferrenceTest { Map<String, String> map = new HashMap<> () { { map.put("key", "value"); } }; }

Syntax changes - Milling Project Coin

37

Prior to Java 9./TypeInferrenceTest.java:7: error: cannot infer type arguments for HashMap<K,V> new HashMap<>() ^ reason: cannot use '<>' with anonymous inner classes where K,V are type-variables: K extends Object declared in class HashMap V extends Object declared in class HashMap 1 error

http://c2.com/cgi/wiki?DoubleBraceInitialization

Page 38: Java 9 preview

Syntax changes - Milling Project Coin• Can’t use single _ as a name

38

// key: compiler.warn.underscore.as.identifier // options: -source 8 -Xlint:-options

class UnderscoreAsIdentifierWarning { String _ = null;}

Page 39: Java 9 preview

Process API Updates• JEP 102: Process API Updates

• New:

• Get pid for this JVM

• Get list of processes

• Operations on trees of processes

Source: http://blog.takipi.com/java-9-the-ultimate-feature-list/

Process proc = Runtime.getRuntime() .exec(new String[]{"/bin/sh", "-c", "echo $PPID"}); if (proc.waitFor() == 0) { InputStream in = proc.getInputStream(); int available = in.available(); byte[] outputBytes = new byte[available]; n.read(outputBytes); String pid = new String(outputBytes); System.out.println("Your pid is " + pid); }

System.out.println("Your pid is " + ProcessHandle.current().getPid());

39

Page 40: Java 9 preview

Spin Loop Hint (JEP-285)

• Scope: latency (& performance) • Features:

• New method j.l.Thread.onSpinWait()• On x86 - translates into the ‘pause’ instruction

• Already used 9 times in JSR 166 for JDK9• java/util/concurrent/locks/StampedLock.java• java/util/concurrent/Phaser.java• java/util/concurrent/SynchronousQueue.java

class EventHandler { volatile boolean eventNotificationNotReceived; void waitForEventAndHandleIt() { while ( eventNotificationNotReceived ) { java.lang.Thread.onSpinWait(); } readAndProcessEvent(); } void readAndProcessEvent() { // Read event from some source and process it . . . }}

40

Page 41: Java 9 preview

Producer/Consumer and SLH

41

Page 42: Java 9 preview

Spin Loop Hint• Cool. I have spin loops. Wait for 9?

• May be not

• Just include the agrona library

• or look at java/org/agrona/hints/ThreadHints.java

• Works for older JDKs

42

https://github.com/real-logic/Agrona/blob/master/src/main/java/org/agrona/hints/ThreadHints.java

Page 43: Java 9 preview

JShell• Project Kulla http://openjdk.java.net/projects/kulla/

• In main trunk since JDK 9 EA build 90

• REPL as you know it for other languages

• Helps teaching Java class HelloWorld { public static void main(String[] args) { System.out.println(" "); } }

43

Page 44: Java 9 preview

Jshell Demo

44

just kick ./bin/jshell and try yourself

Page 45: Java 9 preview

Garbage First is on by default• Pros

• State-of-the-art GC in HotSpot (albeit being 10+ years old)

• Regional parallel concurrent collector

• Targeting both low pause and high throughput

• Default => Great number of users => Bugs detecter sooner => G1 will become even more robust shortly

• Cons

• Due to different characteristics it may reveal synchronisation problems in the code

• Eve after 9 years G1 has bugs with Cassandra, Elasticsearch, Lucene, perhaps, other ones are yet not discovered?

• source (dated July 2015): https://groups.google.com/forum/#!topic/mechanical-sympathy/JxsuVtIIOaY

45

Page 46: Java 9 preview

Surviving the change of default GC• If you used no i.e. default GC settings

• capture the ergonomics at your deployment sites

• consider explicitly setting GC flags in all deployment scripts

• If you already had selected and tuned GC flags

• No changes, old collectors not phasing out

• In any case - keep trying G1

• Understand how GC works

• Basic algorithms and associated metrics

• More reading: http://www.infoq.com/minibooks/java-garbage-collection46

Page 47: Java 9 preview

New JEPs briefly. Performance

• 193: Variable Handles

• 143: Improve Contended Locking

• 266: More Concurrency Updates

• 197: Segmented Code Cache

• 165: Compiler Control

• 243: Java-Level JVM Compiler Interface

• 246: Leverage CPU Instructions for GHASH and RSA

• 250: Store Interned Strings in CDS Archives

• 254: Compact Strings

• 280: Indify String Concatenation

• 230: Microbenchmark Suite

47

Page 48: Java 9 preview

48

Unified JVM Logging• For better diagnostics, uniform across all components• 6 levels of logging x dozens of tags • Output to stdout / stderr / file / rotating file • No more badly interleaved lines• -Xlog:help• 11 decorators

-Xlog:classinit -Xlog:classloaderdata -Xlog:defaultmethods -Xlog:itables -Xlog:monitormismatch -Xlog:safepoint -Xlog:startuptime -Xlog:vmoperation -Xlog:vtables -Xlog:verification

-XX:+TraceClassInitialization -XX:+TraceClassLoaderData -XX:+TraceDefaultMethods -XX:+TraceItables -XX:+TraceMonitorMismatch -XX:+TraceSafepoint -XX:+TraceStartupTime -XX:+TraceVMOperation -XX:+PrintVtables -XX:+VerboseVerification

Page 49: Java 9 preview

49

JEP 223: New Version-String Scheme• System Property Existing Proposed • ------------------------------- ------------ -------- • Early Access • java.version 1.9.0-ea 9-ea • java.runtime.version 1.9.0-ea-b73 9-ea+73 • java.vm.version 1.9.0-ea-b73 9-ea+73 • java.specification.version 1.9 9 • java.vm.specification.version 1.9 9

• Major (GA) • java.version 1.9.0 9 • java.runtime.version 1.9.0-b100 9+100 • java.vm.version 1.9.0-b100 9+100 • java.specification.version 1.9 9 • java.vm.specification.version 1.9 9

• Minor #1 (GA) • java.version 1.9.0_20 9.1.2 • java.runtime.version 1.9.0_20-b62 9.1.2+62 • java.vm.version 1.9.0_20-b62 9.1.2+62 • java.specification.version 1.9 9 • java.vm.specification.version 1.9 9

• Security #1 (GA) • java.version 1.9.0_5 9.0.1 • java.runtime.version 1.9.0_5-b20 9.0.1+20 • java.vm.version 1.9.0_5-b20 9.0.1+20 • java.specification.version 1.9 9

Page 50: Java 9 preview

New JEPs briefly. What’s going away?• 231: Remove Launch-Time JRE Version Selection

• 240: Remove the JVM TI hprof Agent

• 241: Remove the jhat Tool———————————

• Because of modules (JEP - 261)

• -Xbootclasspath & -Xbootclasspath/p

• system property sun.boot.class.path

50

Page 51: Java 9 preview

New JEPs briefly. Client/graphics• 258: HarfBuzz Font-Layout Engine

• 263: HiDPI Graphics on Windows and Linux

• 265: Marlin Graphics Renderer

• 262: TIFF Image I/O

• 257: Update JavaFX/Media to Newer Version of GStreamer (1.4.4)

• 251: Multi-Resolution Images

51

Page 52: Java 9 preview

New JEPs briefly. Security

• 219: Datagram Transport Layer Security (DTLS)

• 229: Create PKCS12 Keystores by Default

• 244: TLS Application-Layer Protocol Negotiation Extension

• 249: OCSP Stapling for TLS

52

Page 53: Java 9 preview

Azul Systems• Zing: A better JVM for the enterprise

• Azul’s innovative Java runtime for business applications• Certified Java SE builds• Removes GC as a factor in your operation• Supports large in-memory data stores• Solves Java’s “warm-up” problem• Runs on distros of RHEL, Ubuntu, SLES and CentOS

•Zulu: Java when all you need is Support • Free and Open Source (based on OpenJDK)• Certified Java SE builds• Runs on Windows, Linux & Mac• Performance parity with Oracle Hotspot• Optional customized “embedded” offerings

53

Page 54: Java 9 preview

Unicode in Java 9

• 227: Unicode 7.0…

• … & 267: Unicode 8.0

54

Page 55: Java 9 preview

Thanks

Q&A

@JohnWings

55