Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

What we can expect from Java 9 by Ivan Krylov

674 views

Published on

Java 9 is currently scheduled to become generally available in less then 1 year. Perhaps now is a good time to have a closer look at language proposals and API changes in Java 9. There are over 70 proposals targeted to Java 9, we will have a looks at some key ones, starting with java modularity. We will look at some breaking changes and ways to develop both short and long term solutions for adoption of new upcoming version of Java.

Published in: Software
  • Be the first to comment

  • Be the first to like this

What we can expect from Java 9 by Ivan Krylov

  1. 1. What to expect from Java 9? Ivan Krylov May 21, 2016 1 @JohnWings #J_OnTheBeach
  2. 2. 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
  3. 3. Java 9 and community 3
  4. 4. 4 http://wiki.netbeans.org/InternalAPIsUnavailableInJava9
  5. 5. 5 Subject: module-info.java just causes problems Date: Wed, 4 May 2016 13:33:06 -0500 From: David M. Lloyd <david.lloyd@redhat.com> To: jigsaw-dev <jigsaw-dev@openjdk.java.net> 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
  6. 6. 6 “There are only two kinds of languages: 
 the ones people complain about and the ones nobody uses.” Bjarne Stroustrup
  7. 7. 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
  8. 8. 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
  9. 9. Java 9 schedule (tent.)Featurecomplete ZeroBugBounce Rampdownphase2 FinalReleaseCandidate May’16 Alltestsrun RampdownStart GeneralAvailability Aug’16 Sept’16 Oct’16 Dec’16 Jan’17 Mar’17 9
  10. 10. 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
  11. 11. How new features become part of Java standard? 11
  12. 12. JEP process 12 Source: http://cr.openjdk.java.net/~mr/jep/jep-2.0-02.html
  13. 13. JSR Source: https://groups.google.com/forum/#!topic/java-social/InafCPMLLaA13
  14. 14. Modules 14
  15. 15. 
 Modules Packages Classes fields & methods Interfaces … Abstract Classes … Code encapsulation 15
  16. 16. Problems being addressed • Java Runtime keep 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
  17. 17. 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
 ModularityJava Module 17
  18. 18. 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 "J on the beach 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
  19. 19. 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
  20. 20. 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
  21. 21. 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
  22. 22. 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 automatically being 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
  23. 23. 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
  24. 24. Types of modules • Named • i.e. containing module-info.class • Automatic • i.e. jar files placed to the module path • Unnamed • contains all types in the classpath 24
  25. 25. 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
  26. 26. 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
  27. 27. 27 java -XaddExports java -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 -XaddReads -XaddReads:java.management=testng
  28. 28. 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
  29. 29. Modularity Source: http://openjdk.java.net/projects/jigsaw/doc/jdk-modularization.html JDK 7 b65JDK 8 b48JDK9 EA 29 http://cr.openjdk.java.net/~mr/jigsaw/ea/module-summary.html
  30. 30. 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
  31. 31. 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
  32. 32. (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
  33. 33. 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
  34. 34. 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*/ } private 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. }
  35. 35. 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) { } }
  36. 36. Syntax changes - Milling Project Coin • @SafeVarargs in private methods class VarargsFinalOnly { @SafeVarargs private void m(List<String>... args) { } } 36
  37. 37. 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
  38. 38. 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; }
  39. 39. 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
  40. 40. Spin Loop Hint • JEP 285: Spin-Wait Hints • Scope: latency & performance • Features: • New method j.l.Thread.onSpinWait() • Just a hint • on x86 - translates into 
 the ‘pause’ instruction 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
  41. 41. Producer/Consumer and SLH 41
  42. 42. Spin Loop Hint • Cool. I have spin loops. Wait for 9? • 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
  43. 43. 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("Hello World!"); } } 43
  44. 44. Jshell Demo 44
  45. 45. JShell - examples • > ./images/jdk/bin/jshell • -> String s=new String("hello"); • | Added variable s of type String with initial value “hello” • -> new String("hello"); • | Expression value is: "hello" • | assigned to temporary variable $1 of type String • -> System.out.println($1); • h • -> ello • -> System.out.println(“hello”); System.out.flush(); • hello 45
  46. 46. 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 46
  47. 47. 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 47
  48. 48. 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 • JEP 280: Indify String Concatenation • 230: Microbenchmark Suite 48
  49. 49. 49 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
  50. 50. 50 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
  51. 51. 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 51
  52. 52. 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 52
  53. 53. 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 53
  54. 54. 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 54
  55. 55. Unicode in Java 9 • 227: Unicode 7.0… • … & 267: Unicode 8.0 55
  56. 56. 56 Conclusions 56
  57. 57. Thanks Q&A @JohnWings 57
  58. 58. 58 Backup on @SafeVarargs @SafeVarargs // Not actually safe! static void m(List<String>... stringLists) { Object[] array = stringLists; List<Integer> tmpList = Arrays.asList(42); array[0] = tmpList; // Semantically invalid, but compiles without warnings String s = stringLists[0].get(0); // Oh no, ClassCastException at runtime! }
  59. 59. that’s it 59

×