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

Java 9 Preview

Java 9 Preview

Slides for the talk at @geekout2016

Ivan Krylov

June 09, 2016
Tweet

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. 6 “There are only two kinds of languages: 
 the

    ones people complain about and the ones nobody uses.” Bjarne Stroustrup
  4. Java Timeline JDK 6
 Dec 2006 JDK 7
 July 2011

    JDK 8
 March 2014 JDK 9
 exp. March 2017 JDK 6
 Nov 2012 JDK 7
 Apr 2015 JDK 8
 exp. Mar 2018 J2SE 1.4
 Dec 2006 JDK 5
 Oct 2009 7 GA EOL
  5. Java EOL & You? EOL date passed Security vulnerabilities keep

    appearing & Sign Support contact Adopt OpenJDK (Zulu, IcedTea, homebrew builds) Updated to latest JDK 8 Updates needed
  6. Java 9 schedule (tent.) Feature complete Zero Bug Bounce Rampdown

    phase 2 Final Release Candidate May’16 All tests run Rampdown Start General Availability Aug ’16 Sept ’16 Oct ’16 Dec ’16 Jan ’17 Mar ’17 9
  7. 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
  8. 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 default 16
  9. Jigsaw JEP 162: Prepare for Modularization JEP 200: The Modular

    JDK
 JEP 220: Modular Run-Time Images JEP 201: Modular Source Code JEP 260: Encapsulate Most Internal APIs JEP 282: jlink: The Java Linker
 JSR 376: Java Platform Module System JEP 261: Module System
 Modularity Java Module 17
  10. Example 1 s_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 Module p_module 18
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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.corba
 java.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/261 23
  16. 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
  17. 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
  18. 26 jdeps -jdkinternals glassfish-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
  19. 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
  20. 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
  21. Jigsaw - Unresolved issues http://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
  22. (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
  23. 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
  24. 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*/ ; } }
  25. 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) { } }
  26. 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
  27. 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
  28. 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; }
  29. 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
  30. 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
  31. 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
  32. 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("*GNNQ9QTNF"); } } 43
  33. 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
  34. 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-collection 46
  35. 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
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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