What to expect from Java 9?
Ivan Krylov

June 9, 2016
1
@JohnWings
#GeekOutEE
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
Java 9 and community
3
4
http://wiki.netbeans.org/InternalAPIsUnavailableInJava9
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
“There are only two kinds of languages: 

the ones people complain about and the ones nobody uses.”
Bjarne Stroustrup
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
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
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
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
How new features become part of
Java standard?
11
JEP process
12
Source: http://cr.openjdk.java.net/~mr/jep/jep-2.0-02.html
JSR
Source: https://groups.google.com/forum/#!topic/java-social/InafCPMLLaA13
Modules
14


Modules
Packages
Classes
fields &
methods
Interfaces
…
Abstract
Classes
…
Code encapsulation
15
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
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
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
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
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
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
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
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
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
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
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
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
java -XaddReads:java.management=testng
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
JDK9 EA
Modularity
Source: http://openjdk.java.net/projects/jigsaw/doc/jdk-modularization.html
29
http://cr.openjdk.java.net/~mr/jigsaw/ea/module-summary.html
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
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
(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
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
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*/ ; }
}
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) {
}
}
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
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
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;
}
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
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
Producer/Consumer and SLH
41
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
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
Jshell Demo
44
just kick ./bin/jshell and try yourself
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
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
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
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
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
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
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
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
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
Unicode in Java 9
• 227: Unicode 7.0…

• … & 267: Unicode 8.0
54
Thanks

Q&A
@JohnWings
55

Java 9 preview

  • 1.
    What to expectfrom Java 9? Ivan Krylov June 9, 2016 1 @JohnWings #GeekOutEE
  • 2.
    Why talking aboutit 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.
    Java 9 andcommunity 3
  • 4.
  • 5.
    5 Subject: module-info.java justcauses 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 “There are onlytwo kinds of languages: 
 the ones people complain about and the ones nobody uses.” Bjarne Stroustrup
  • 7.
    Java Timeline JDK 6
 Dec2006 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.
    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.
    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.
    What (was) newin 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.
    How new featuresbecome part of Java standard? 11
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
    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
  • 17.
    Jigsaw JEP 162: Preparefor 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.
    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
  • 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.
    New parameters forjavac/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.
    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.
    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
  • 23.
    Unnamed modules canaccess 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.
    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
  • 25.
    25 jdeps -genmoduleinfo cat /Users/ivan/test/modules/generated/glassfish.corba.omgapi/module-info.java moduleglassfish.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 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.
  • 28.
    28 • Consider anapp 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.
  • 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.
    Jigsaw - Unresolvedissues 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.
    (My) takeaways onJava 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.
    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.
    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*/ ; } }
  • 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.
    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
  • 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.
    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.
    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.
    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
  • 41.
  • 42.
    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
  • 43.
    JShell • Project Kullahttp://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
  • 44.
    Jshell Demo 44 just kick./bin/jshell and try yourself
  • 45.
    Garbage First ison 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
  • 46.
    Surviving the changeof 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
  • 47.
    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
  • 48.
    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
  • 49.
    49 JEP 223: NewVersion-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
  • 50.
    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
  • 51.
    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
  • 52.
    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
  • 53.
    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
  • 54.
    Unicode in Java9 • 227: Unicode 7.0… • … & 267: Unicode 8.0 54
  • 55.