SlideShare a Scribd company logo
Java 12 - CAFE BABE 0000 0038Java 12 - CAFE BABE 0000 0038
Jonatan
The JVM Explorer
Marco
The fullstack guy
Missing features
Where is
Shenandoah?Some Garbage(Collectors) Fun facts
Code examples
New features
and their stories
New pitfalls!Release
19.03.2019
Java 12 - CAFE BABE 0000 0038
Jonatan Kaźmierczak
● Senior consultant at Trivadis
● Creator of Class Visualizer
● Creator of Maths practice for children
● Contributor to JDK projects: Graal, JMC
● Has used over 0x10 programming languages
● Top-rated contestant in programming, algorithms
and data science at HackerRank, Google Code Jam, TopCoder
Java 12 - CAFE BABE 0000 0038
● Freelance Java and Angular consultant
● Java meetups in ZH … come, share and have fun
https://www.meetup.com/Java-Switzerland/
Marco Molteni
@marcomolteni
https://javaee.ch
Java 12 - CAFE BABE 0000 0038
ToC
● Poll
● Java Enhancement Proposal Overview
● Standard library enhancements
● JDK 11 or JDK 12? Which distribution?
Java 12 - CAFE BABE 0000 0038
Which Java version are you currently using?
Version Release
11 09.2018
8 03.2014
< 8 <= 2011
Poll
Java 12 - CAFE BABE 0000 0038
JDK Enhancement Proposal (JEP)
189:
Shenandoah: A Low-Pause-Time
Garbage Collector (Experimental)
230:
Microbenchmark Suite
325:
Switch Expressions (Preview)
326:
Raw Literals (Preview)
334:
JVM Constants API
340:
One AArch64 Port, Not Two
341:
Default CDS Archives
344:
Abortable Mixed Collections for G1
346:
Promptly Return Unused Committed Memory
from G1
openjdk.java.net/projects/jdk/12
JEP 12
Click on the JEP link to open its official page.
Java 12 - CAFE BABE 0000 0038
Other improvements (not announced)
● CompactNumberFormat
● String#indent
● String#transform
● Collectors#teeing
● Files#mismatch
● HttpsURLConnetion#getSSLConnection
● SecureCacheResponse#getSSLSession
● CompletionStage#exceptionallyAsync
● JShell improvements
● Minor improvements (e.g. CHESS
Character.UnicodeBlock)
● > 650 Bug fixed affecting JDK 11
Discoveries
We have found these changes comparing the code source of the JDK 12 and the 11. An easy to use alternative JDK Diff.
You can click on the class name to open the JavaDoc.
Standard library General
Java 12 - CAFE BABE 0000 0038
JEP Feature Preview and Experimental
Some features are in ‘Preview’ or ‘Experimental’ status.
These features need to be explicitly activated.
Status Definition To activate Link
Preview The feature is implemented but feedbacks
are desired. It could be refined, removed or
become permanent in future releases.
--enable-preview http://openjdk.jav
a.net/jeps/12
Experimental The feature has to mature or the value has
still to be determined. Some OpenJDK
editors could not include (compilation
exclusion) the feature.
-XX:+UnlockExperimentalVMOptions
(If supported by your JDK)
http://openjdk.jav
a.net/jeps/82045
56
Disclaimer
Java 12 - CAFE BABE 0000 0038
JShell usability improvements
We like it!
Java 12 - CAFE BABE 0000 0038
JEP 326 - Raw String Literals (Preview)
var json = `
{
"name": "OpenJDK",
"version": 12
}
`;
Readable multi-line string without Java
indicators.
Dropped!
Announcement linkAlready available in:
C, C++, C#, Dart, Go, Groovy, Haskell, JavaScript,
Kotlin, Perl, PHP, Python, R, Ruby, Scala, Swift and
TypeScript
Java 12 - CAFE BABE 0000 0038
String#trasform
public interface Uppercase {
static String wordsCapitalizer(String text) {
return Pattern.compile("bp{L}").matcher(text).replaceAll(m ->
m.group().toUpperCase());
}
}
// New 'feature'
"voxxed days zürich".transform(Uppercase::wordsCapitalizer); //-> Voxxed Days Zürich
// Good old Java
Uppercase.wordsCapitalizer("voxxed days zürich"); //-> Voxxed Days Zürich
Raw String Literals leftover
It applies a provided function to a String and returns its result.
Nothing really
new!
In a future release, this method could be added to Optional https://bugs.openjdk.java.net/browse/JDK-8214753
In our opinion the code used to motivate the introduction of this feature is
unsuitable: https://bugs.openjdk.java.net/browse/JDK-8203703
Java 12 - CAFE BABE 0000 0038
String#trasform - is it really needed?
Raw String Literals leftover
Sources: https://www.mail-archive.com/core-libs-dev@openjdk.java.net/msg54609.html
The mailing list of the core-libs-dev team (JDK) hosted some interesting
debates about this feature. Not all the developers were happy with the
new method, between the doubts:
● the name: some developers were not happy with the choice and how
it has been announced (map, process, apply were between the
options), the name could not fit with Stream and other objects
● the chain method could be a better solution
https://bugs.openjdk.java.net/browse/JDK-8140283
● the method is not really useful and limited to String
● a cleaner solution to transform/format a String could have been a
pipe ‘|>’ like in other languages
● with so many open points waiting until release 13 could have been
more appropriated
“The originating goal was
to allow custom alignment
methods for those
developers not satisfied
with String::align()”
http://mail.openjdk.java.net/pipermail/c
ore-libs-dev/2018-September/055553.h
tml
Where is String::align?
Java 12 - CAFE BABE 0000 0038
String#indent
Limited use
cases!
Raw String Literals leftover
Add or remove spaces at the beginning of a String
and normalize the end with a ‘n’.
var jsonInner = "'name': 'OpenJDK',n'version': 12n"
.replace( ''', '"' );
var jsonOuter = "{n" + jsonInner.indent( 4 ) + "}n";
System.out.println( jsonOuter );
{
"name": "OpenJDK",
"version": 12
}
Result
Useful to format JSON, XML and code snippets.
Added together with String#align to support Raw String Literals; in contrast to RSL and String#align (dopped) it is still in the
JDK : https://bugs.openjdk.java.net/browse/JDK-8200435.
Java 12 - CAFE BABE 0000 0038
JEP 325 - Switch expression (Preview) - Example
Remember to enable the preview mode: jshell --enable-preview
String developerRating( int numberOfChildren ) {
return switch (numberOfChildren) {
case 0 -> "open source contributor";
case 1,2 -> "junior";
case 3 -> "senior";
default -> {
if (numberOfChildren < 0)
throw new IndexOutOfBoundsException( numberOfChildren );
break "manager";
}
};
}
developerRating( 0 ); // ==> "open source contributor"
developerRating( 4 ); // ==> "manager"
Do you notice the differences
with the switch statement?
Less code
verbosity but
only preview!
Java 12 - CAFE BABE 0000 0038
// Java 12 (expression)
case 0 -> "free time";
case 1 -> "junior";
JEP 325 - Switch expression (Preview) - Diff
No more break; required (for single expressions)
Multiple labels with only one case
// Java 12 (expression)
case 2,3 -> "expert";
// Java 1 (statement)
case 2:
case 3: "expert"; break;
// Java 1 (statement)
case 0: "free time"; break;
case 1: "junior"; break;
This JEP is required by the candidate feature JEP 305 : Pattern Matching for instanceof
Extend the switch statement so that it can be used as either a statement or
an expression
Java 12 - CAFE BABE 0000 0038
JEP 325 - Switch expression (Preview) - Diff 2
Scope of local variables
All the cases have to be covered
// Java <12 (statement)
... not enforced ...
// Java <12 - statement
// switch block scope
case 0: int a = 123; break;
case 1: int a = 345; break; // ERROR!
// Java 12 - expression
// case block scope
case 0 -> {int a = 123; break a;}
case 1 -> {int a = 345; break a;}
// Java 12 (expression)
case 0 -> "Value found";
// Compilation error if default not present
default -> throw new IllegalStateException();
break statement to return a value from a block scope
// Java <12 (statement)
... not applicable ...
// Java 12 - expression
case 0 -> {break "Result here";}
Java 12 - CAFE BABE 0000 0038
Compact Number Format - Short
Bugs!
Debatable scope!
Unicode Standard
import java.text.*;
var cnf = NumberFormat.getCompactNumberInstance();
cnf.format( 1_000 ); // ==> 1K
cnf.format( 1_920 ); // ==> 2K - instead of 1.9K
cnf.format( 1_000_000 ); // ==> 1M
cnf.format( 1L << 30 ); // ==> 1B
cnf.format( 1L << 40 ); // ==> 1T
cnf.format( 1L << 50 ); // ==> 1126T
This new feature implements the Unicode Compact Number Format:
https://unicode.org/reports/tr35/tr35-numbers.html#Compact_Number_Formats
According to Unicode: “The short format is designed for UI environments where
space is at a premium, and should ideally result in a formatted string no more
than about 6 em wide”.
Java 12 - CAFE BABE 0000 0038
Compact Number Format - Long
Unicode Standard
import java.text.*;
var cnf = NumberFormat.getCompactNumberInstance(
Locale.GERMAN, NumberFormat.Style.LONG );
cnf.format( 1_000 ); // ==> 1 Tausend
cnf.format( 1_000_000 ); // ==> 1 Million
cnf.format( 2_000_000 ); // ==> 2 Million (!) - instead of 2 Millionen
cnf.format( 17_000_000 ); // ==> 17 Millionen
cnf.format( 1L << 30 ); // ==> 1 Milliarde
cnf.format( 1L << 31 ); // ==> 2 Milliarde (!) - instead of 2 Milliarden
cnf.format( 1L << 34 ); // ==> 17 Milliarden
cnf.format( 1L << 40 ); // ==> 1 Billion
cnf.format( 1L << 41 ); // ==> 2 Billion (!) - instead of 2 Billionen
cnf.format( 1L << 50 ); // ==> 1126 Billionen
The long variant of the
compact number format
contains mistakes.
Before using this feature
check if the problem has
been corrected!
Java 12 - CAFE BABE 0000 0038
Compact Number Format - Swiss edition
Unicode Standard
{ "long.CompactNumberPatterns",
new String[] {
"",
"",
"",
"0 Tausend",
"00 Tausend",
"000 Tausend",
"0 Million",
"00 Millionen",
"000 Millionen",
"0 Milliarde",
"00 Milliarden",
"000 Milliarden",
"0 Billion",
"00 Billionen",
"000 Billionen",
}
},
FormatData_de.java FormatData_fr.java
{ "long.CompactNumberPatterns",
new String[] {
"",
"",
"",
"0 millier",
"00 mille",
"000 mille",
"0 million",
"00 million",
"000 million",
"0 milliard",
"00 milliard",
"000 milliard",
"0 billion",
"00 billion",
"000 billion",
}
},
{ "long.CompactNumberPatterns",
new String[] {
"",
"",
"",
"0 mille",
"00 mila",
"000 mila",
"0 milione",
"00 milioni",
"000 milioni",
"0 miliardo",
"00 miliardi",
"000 miliardi",
"0 mille miliardi",
"00 mila miliardi",
"000 mila miliardi",
}
},
FormatData_it.java
Here the values used in German, French and Italian. There are errors and the
implementation pattern is inadequate. There is no Rumantsch version.
FormatData_rm.java
?
Java 12 - CAFE BABE 0000 0038
Files#mismatch
Different content
FileOne: ‘abcdef’
FileTwo: ‘abcd1f’
Same content
FileOne: ‘abcdef’
FileTwo: ‘abcdef’
result = 4L
result = -1L
Different file size (encoding)
FileOne: ‘Zürich’
FileTwo: ‘Zürich’
result = 1L
(size of the file)
Non existing file
Files.mismatch
(Paths.get(“null”), Paths.get(“null”)) -1L
var result = Files.mismatch(pathFileOne, pathFileTwo);
Nice but …
watch out!
/**
* Finds and returns the position of the first mismatched byte in the content
* of two files, or -1L if there is no mismatch.[...]
*/
Java 12 - CAFE BABE 0000 0038
Collector#teeing - Example
It collects a Stream using two independent collectors. The results are
merged using a BiFunction
Interesting
small update.
'XX' Conferences: [Devoxx, Voxxed Days]
'One' Conferences: [Code One, Basel One]
result
var result =
Stream.of("Devoxx", "Voxxed Days", "Code One", "Basel One")
.collect(Collectors.teeing(
// first collector
Collectors.filtering(n -> n.contains("xx"), Collectors.toList()),
// second collector
Collectors.filtering(n -> n.endsWith("One"), Collectors.toList()),
// merger - automatic type inference doesn't work here
(List<String> list1, List<String> list2) -> List.of(list1, list2)
));
System.out.println("'XX' Conferences: " + result.get(0));
System.out.println("'One' Conferences: " + result.get(1));
Java 12 - CAFE BABE 0000 0038
Collectors teeing - Fun facts
The etymology of teeing can help us to remember the name during our daily
activity or to show our knowledge at the workplace.
Teeing is originated from the plumbing tee!
Wikipedia: ‘A tee, the most common pipe fitting, is used to combine (or
divide) fluid flow.’
Linux has the tee command that splits the data! Among the authors we find
Richard Stallman.
Other names proposed for this feature:
bisecting, duplexing, bifurcate, replicator, fanout, tapping, unzipping,
tapping, collectionToBothAndThen, biCollecting, expanding, forking, etc.
http://mail.openjdk.java.net/pipermail/core-libs-dev/2018-June/053987.html
Java 12 - CAFE BABE 0000 0038
JEP 334 - JVM Constants API
Class Visualizer generated diagrams
Could be
confusing.
Don’t be surprised if your IDE will suggest these new
methods: describeConstable, resolveConstantDesc.
If you don’t work with constant pools ignore them.
Constant pools documentation
Java 12 - CAFE BABE 0000 0038
Constable#describeConstable and #resolveConstantDesc
JEP 334 - JVM Constants API
public interface Constable {
/**
* Returns an {@link Optional} containing the nominal descriptor for this
* instance, if one can be constructed, or an empty {@link Optional}
* if one cannot be constructed. [...]
**/
Optional<? extends ConstantDesc> describeConstable();
}
"Java 12".describeConstable(); // ==> Optional[Java 12]Example
Not relevant
for most of
the devs.
public interface ConstantDesc {
/**
* @param lookup The {@link MethodHandles.Lookup} to provide name resolution
* and access control context
* @return the resolved constant value [...]
*/
Object resolveConstantDesc(MethodHandles.Lookup lookup)
throws ReflectiveOperationException;
}
"Java 12".resolveConstantDesc( null ); // ==> "Java 12"Example
Java 12 - CAFE BABE 0000 0038
JEP 189 - Shenandoah (Experimental)
Ultra-low pause, async GC. It doesn’t require a Full GC
cycle.
Great for containers and cloud. Disabled in
Oracle builds...
Shenandoah
… but in
RedHat buildssince JDK 8https://wiki.openjdk.java.net/display/shenandoah/Main
Latency distribution
Java 12 - CAFE BABE 0000 0038
JEP 189 - Shenandoah - Where to find it?
$ java -XX:+UseShenandoahGC -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
In Red Hat Enterprise
Linux OpenJDK since
v1.8.0 and production
ready!
$ java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -verbose:gc -version
[0.005s][info][gc] Using Shenandoah
openjdk version "12" 2019-03-19
OpenJDK Runtime Environment (build 12+33-Debian-1)
OpenJDK 64-Bit Server VM (build 12+33-Debian-1, mixed mode, sharing)
In Debian as
experimental.
$ java -XX:+UseShenandoahGC
Error: VM option 'UseShenandoahGC' is experimental and must be enabled via
-XX:+UnlockExperimentalVMOptions.
$ java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
Error occurred during initialization of VM
Option -XX:+UseShenandoahGC not supported
Oracle builds don’t
support it.
https://bugs.openjdk.java.
net/browse/JDK-8215030
Java 12 - CAFE BABE 0000 0038
JEP 189 - Shenandoah - In depth
Only for GC hackers
The most detailed and technical
presentation of Shenandoah is from
Aleksey Shipilëv (Red Hat), the
author of this GC.
https://shipilev.net/talks/
javazone-Sep2018-shenandoah.pdf
For starters
Excellent GC introduction by Jelastic. They initiated and
contributed to JEP 346.
https://www.slideshare.net/jelastic/
elastic-jvm-automatic-vertical-scaling-of-the-java-heap
Java 12 - CAFE BABE 0000 0038
Shenandoah has already similar features (experimental):
-XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay
JEP 346 - Promptly Return unused committed
memory from G1
● Improve GC in containers
● VM should detect phases of heap
under-utilization to reduce the heap usage
during this phase
Feature initiated by Ruslan Synytsky (Jelastic) and Rodrigo Bruno
(http://www.inesc-id.pt/).
Improvement
in heap usage!
Containers
focus!
Java 12 - CAFE BABE 0000 0038
With the new approach the G1 stops and splits the collection if the amount of work required to collect live objects from the
collection set exceeds the configured pause time limit.
Previously, G1 had to collect all the live objects in a collection set without stopping.
JEP 344 - Abortable Mixed Collection for G1
● Introduces G1 collection pauses of
configured/predictable length
● Increases the application throughput
Improvements
in G1
efficiency.
Java 12 - CAFE BABE 0000 0038
● Announced improvement of the startup time through the creation
of a classes’ metadata list shared between JVM processes
● In previous versions java -Xshare:dump was required. dump
generates jre/lib/server/classes.jsa binary file with the
metadata
●
JEP 341 - Default Class Data Sharing Archive
CDS records in a file the classes’ metadata to use it with the JVM. It is possible to include the application classpath since JEP
310 (Java 10). The improvement could be noticeable in particular scenarios with multiple JVMs sharing the same metadata.
CDS documentation. An informative article https://blog.codefx.org/java/application-class-data-sharing/
No noticeable
improvement
in modern
scenarios
Is it still relevant in a docker / kubernetes /
microservices world?
Java 12 - CAFE BABE 0000 0038
JEP internal JDK changes
● 230: Microbenchmark tools for JDK
“Add a basic suite of microbenchmarks to the JDK source
code, and make it easy for developers to run existing
microbenchmarks and create new ones.”
● 340: One AArch64 Port
“Remove all of the sources related to the arm64 port while
retaining the 32-bit ARM port and the 64-bit aarch64 port.” Not relevant
to us
developers!
Java 12 - CAFE BABE 0000 0038
Quo vadis JDK Mission Control 7?
● Promised final RC date: 02.01.2019
● Still in Early-Access phase
● All previous downloads removed: http://jdk.java.net/jmc/
● There are many unresolved issues, including the one
reported by Jonatan:
https://bugs.openjdk.java.net/browse/JMC-6195?jql=proje
ct%20%3D%20JMC
Promised …
Not delivered!
Missing leftover from JDK 11
Java 12 - CAFE BABE 0000 0038
Which JDK ?
12 - rel. train
❏ Small new features
❏ 6 months of bug fixes
❏ 650 bug fixes
❏ JShell improvements
❏ Full backward compatibility
❏ GC improvements. Focus on
containers and cloud!
❏ Test future LTS features
11 - LTS
❏ Follow LTS releases (11 -> 17)
❏ Framework/Server dependency
❏ Production environments
Java 12 - CAFE BABE 0000 0038
So many options … choose your OpenJDK!
Name / Editor Link
Oracle jdk.java.net/12/
RedHat developers.redhat.com/products/openjdk
Open J9 / Eclipse www.eclipse.org/openj9
Corretto / Amazon aws.amazon.com/corretto/
Zulu / Azul www.azul.com/
AdoptOpenJDK / IBM, Clarity, etc. adoptopenjdk.net
SapMachine / SAP sap.github.io/SapMachine/
Linux distribution Linux distribution
You Your laptop
Excellent info here: https://medium.com/@javachampions/java-is-still-free-2-0-0-6b9aa8d6d244
Java 12 - CAFE BABE 0000 0038
Q&A
What’s this thing? Coffee? Guess
and check in the last slide!
Jonatan’s GitHub, with more examples and tech
details:
https://github.com/jonatan-kazmierczak/
java-new-features/
Java Zurich Meetup:
https://www.meetup.com/Java-Switzerland/
Marco’s blog and twitter:
https://javaee.ch @marcomolteni
Links
Java 12 - CAFE BABE 0000 0038
https://en.wikipedia.org/wiki/Java_class_file
JSR 202
Java 12 = Class Format Version 56 (0x38 hex)
Compiled Java classes start with a magic number in hex:
CAFE BABE
followed by the minor version number of the class file
major version number of the class file.
Java 12 will have the major version of class format = 56.
Remember it if you see:
Exception in thread "main" java.lang.UnsupportedClassVersionError: Example
has been compiled by a more recent version of the Java Runtime (class file
version 56.0), this version of the Java Runtime only recognizes class file
versions up to 55.0
> hexdump -C Example.class
00000000 ca fe ba be 00 00 00 38 00 1c 0a 00 06 00 0e 09 |.......7........|
00000010 00 0f 00 10 08 00 11 0a 00 12 00 13 07 00 14 07 |................|
00000020 00 15 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29 |.....<init>...()|
00000030 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e |V...Code...LineN|
00000040 75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 |umberTable...mai|
00000050 6e 01 00 0a 53 6f 75 72 63 65 46 69 6c 65 01 00 |n...SourceFile..|
00000060 0c 45 78 61 6d 70 6c 65 2e 6a 61 76 61 0c 00 07 |.Example.java...|

More Related Content

Java 12 - New features in action

  • 1. Java 12 - CAFE BABE 0000 0038Java 12 - CAFE BABE 0000 0038 Jonatan The JVM Explorer Marco The fullstack guy Missing features Where is Shenandoah?Some Garbage(Collectors) Fun facts Code examples New features and their stories New pitfalls!Release 19.03.2019
  • 2. Java 12 - CAFE BABE 0000 0038 Jonatan Kaźmierczak ● Senior consultant at Trivadis ● Creator of Class Visualizer ● Creator of Maths practice for children ● Contributor to JDK projects: Graal, JMC ● Has used over 0x10 programming languages ● Top-rated contestant in programming, algorithms and data science at HackerRank, Google Code Jam, TopCoder
  • 3. Java 12 - CAFE BABE 0000 0038 ● Freelance Java and Angular consultant ● Java meetups in ZH … come, share and have fun https://www.meetup.com/Java-Switzerland/ Marco Molteni @marcomolteni https://javaee.ch
  • 4. Java 12 - CAFE BABE 0000 0038 ToC ● Poll ● Java Enhancement Proposal Overview ● Standard library enhancements ● JDK 11 or JDK 12? Which distribution?
  • 5. Java 12 - CAFE BABE 0000 0038 Which Java version are you currently using? Version Release 11 09.2018 8 03.2014 < 8 <= 2011 Poll
  • 6. Java 12 - CAFE BABE 0000 0038 JDK Enhancement Proposal (JEP) 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) 230: Microbenchmark Suite 325: Switch Expressions (Preview) 326: Raw Literals (Preview) 334: JVM Constants API 340: One AArch64 Port, Not Two 341: Default CDS Archives 344: Abortable Mixed Collections for G1 346: Promptly Return Unused Committed Memory from G1 openjdk.java.net/projects/jdk/12 JEP 12 Click on the JEP link to open its official page.
  • 7. Java 12 - CAFE BABE 0000 0038 Other improvements (not announced) ● CompactNumberFormat ● String#indent ● String#transform ● Collectors#teeing ● Files#mismatch ● HttpsURLConnetion#getSSLConnection ● SecureCacheResponse#getSSLSession ● CompletionStage#exceptionallyAsync ● JShell improvements ● Minor improvements (e.g. CHESS Character.UnicodeBlock) ● > 650 Bug fixed affecting JDK 11 Discoveries We have found these changes comparing the code source of the JDK 12 and the 11. An easy to use alternative JDK Diff. You can click on the class name to open the JavaDoc. Standard library General
  • 8. Java 12 - CAFE BABE 0000 0038 JEP Feature Preview and Experimental Some features are in ‘Preview’ or ‘Experimental’ status. These features need to be explicitly activated. Status Definition To activate Link Preview The feature is implemented but feedbacks are desired. It could be refined, removed or become permanent in future releases. --enable-preview http://openjdk.jav a.net/jeps/12 Experimental The feature has to mature or the value has still to be determined. Some OpenJDK editors could not include (compilation exclusion) the feature. -XX:+UnlockExperimentalVMOptions (If supported by your JDK) http://openjdk.jav a.net/jeps/82045 56 Disclaimer
  • 9. Java 12 - CAFE BABE 0000 0038 JShell usability improvements We like it!
  • 10. Java 12 - CAFE BABE 0000 0038 JEP 326 - Raw String Literals (Preview) var json = ` { "name": "OpenJDK", "version": 12 } `; Readable multi-line string without Java indicators. Dropped! Announcement linkAlready available in: C, C++, C#, Dart, Go, Groovy, Haskell, JavaScript, Kotlin, Perl, PHP, Python, R, Ruby, Scala, Swift and TypeScript
  • 11. Java 12 - CAFE BABE 0000 0038 String#trasform public interface Uppercase { static String wordsCapitalizer(String text) { return Pattern.compile("bp{L}").matcher(text).replaceAll(m -> m.group().toUpperCase()); } } // New 'feature' "voxxed days zürich".transform(Uppercase::wordsCapitalizer); //-> Voxxed Days Zürich // Good old Java Uppercase.wordsCapitalizer("voxxed days zürich"); //-> Voxxed Days Zürich Raw String Literals leftover It applies a provided function to a String and returns its result. Nothing really new! In a future release, this method could be added to Optional https://bugs.openjdk.java.net/browse/JDK-8214753 In our opinion the code used to motivate the introduction of this feature is unsuitable: https://bugs.openjdk.java.net/browse/JDK-8203703
  • 12. Java 12 - CAFE BABE 0000 0038 String#trasform - is it really needed? Raw String Literals leftover Sources: https://www.mail-archive.com/core-libs-dev@openjdk.java.net/msg54609.html The mailing list of the core-libs-dev team (JDK) hosted some interesting debates about this feature. Not all the developers were happy with the new method, between the doubts: ● the name: some developers were not happy with the choice and how it has been announced (map, process, apply were between the options), the name could not fit with Stream and other objects ● the chain method could be a better solution https://bugs.openjdk.java.net/browse/JDK-8140283 ● the method is not really useful and limited to String ● a cleaner solution to transform/format a String could have been a pipe ‘|>’ like in other languages ● with so many open points waiting until release 13 could have been more appropriated “The originating goal was to allow custom alignment methods for those developers not satisfied with String::align()” http://mail.openjdk.java.net/pipermail/c ore-libs-dev/2018-September/055553.h tml Where is String::align?
  • 13. Java 12 - CAFE BABE 0000 0038 String#indent Limited use cases! Raw String Literals leftover Add or remove spaces at the beginning of a String and normalize the end with a ‘n’. var jsonInner = "'name': 'OpenJDK',n'version': 12n" .replace( ''', '"' ); var jsonOuter = "{n" + jsonInner.indent( 4 ) + "}n"; System.out.println( jsonOuter ); { "name": "OpenJDK", "version": 12 } Result Useful to format JSON, XML and code snippets. Added together with String#align to support Raw String Literals; in contrast to RSL and String#align (dopped) it is still in the JDK : https://bugs.openjdk.java.net/browse/JDK-8200435.
  • 14. Java 12 - CAFE BABE 0000 0038 JEP 325 - Switch expression (Preview) - Example Remember to enable the preview mode: jshell --enable-preview String developerRating( int numberOfChildren ) { return switch (numberOfChildren) { case 0 -> "open source contributor"; case 1,2 -> "junior"; case 3 -> "senior"; default -> { if (numberOfChildren < 0) throw new IndexOutOfBoundsException( numberOfChildren ); break "manager"; } }; } developerRating( 0 ); // ==> "open source contributor" developerRating( 4 ); // ==> "manager" Do you notice the differences with the switch statement? Less code verbosity but only preview!
  • 15. Java 12 - CAFE BABE 0000 0038 // Java 12 (expression) case 0 -> "free time"; case 1 -> "junior"; JEP 325 - Switch expression (Preview) - Diff No more break; required (for single expressions) Multiple labels with only one case // Java 12 (expression) case 2,3 -> "expert"; // Java 1 (statement) case 2: case 3: "expert"; break; // Java 1 (statement) case 0: "free time"; break; case 1: "junior"; break; This JEP is required by the candidate feature JEP 305 : Pattern Matching for instanceof Extend the switch statement so that it can be used as either a statement or an expression
  • 16. Java 12 - CAFE BABE 0000 0038 JEP 325 - Switch expression (Preview) - Diff 2 Scope of local variables All the cases have to be covered // Java <12 (statement) ... not enforced ... // Java <12 - statement // switch block scope case 0: int a = 123; break; case 1: int a = 345; break; // ERROR! // Java 12 - expression // case block scope case 0 -> {int a = 123; break a;} case 1 -> {int a = 345; break a;} // Java 12 (expression) case 0 -> "Value found"; // Compilation error if default not present default -> throw new IllegalStateException(); break statement to return a value from a block scope // Java <12 (statement) ... not applicable ... // Java 12 - expression case 0 -> {break "Result here";}
  • 17. Java 12 - CAFE BABE 0000 0038 Compact Number Format - Short Bugs! Debatable scope! Unicode Standard import java.text.*; var cnf = NumberFormat.getCompactNumberInstance(); cnf.format( 1_000 ); // ==> 1K cnf.format( 1_920 ); // ==> 2K - instead of 1.9K cnf.format( 1_000_000 ); // ==> 1M cnf.format( 1L << 30 ); // ==> 1B cnf.format( 1L << 40 ); // ==> 1T cnf.format( 1L << 50 ); // ==> 1126T This new feature implements the Unicode Compact Number Format: https://unicode.org/reports/tr35/tr35-numbers.html#Compact_Number_Formats According to Unicode: “The short format is designed for UI environments where space is at a premium, and should ideally result in a formatted string no more than about 6 em wide”.
  • 18. Java 12 - CAFE BABE 0000 0038 Compact Number Format - Long Unicode Standard import java.text.*; var cnf = NumberFormat.getCompactNumberInstance( Locale.GERMAN, NumberFormat.Style.LONG ); cnf.format( 1_000 ); // ==> 1 Tausend cnf.format( 1_000_000 ); // ==> 1 Million cnf.format( 2_000_000 ); // ==> 2 Million (!) - instead of 2 Millionen cnf.format( 17_000_000 ); // ==> 17 Millionen cnf.format( 1L << 30 ); // ==> 1 Milliarde cnf.format( 1L << 31 ); // ==> 2 Milliarde (!) - instead of 2 Milliarden cnf.format( 1L << 34 ); // ==> 17 Milliarden cnf.format( 1L << 40 ); // ==> 1 Billion cnf.format( 1L << 41 ); // ==> 2 Billion (!) - instead of 2 Billionen cnf.format( 1L << 50 ); // ==> 1126 Billionen The long variant of the compact number format contains mistakes. Before using this feature check if the problem has been corrected!
  • 19. Java 12 - CAFE BABE 0000 0038 Compact Number Format - Swiss edition Unicode Standard { "long.CompactNumberPatterns", new String[] { "", "", "", "0 Tausend", "00 Tausend", "000 Tausend", "0 Million", "00 Millionen", "000 Millionen", "0 Milliarde", "00 Milliarden", "000 Milliarden", "0 Billion", "00 Billionen", "000 Billionen", } }, FormatData_de.java FormatData_fr.java { "long.CompactNumberPatterns", new String[] { "", "", "", "0 millier", "00 mille", "000 mille", "0 million", "00 million", "000 million", "0 milliard", "00 milliard", "000 milliard", "0 billion", "00 billion", "000 billion", } }, { "long.CompactNumberPatterns", new String[] { "", "", "", "0 mille", "00 mila", "000 mila", "0 milione", "00 milioni", "000 milioni", "0 miliardo", "00 miliardi", "000 miliardi", "0 mille miliardi", "00 mila miliardi", "000 mila miliardi", } }, FormatData_it.java Here the values used in German, French and Italian. There are errors and the implementation pattern is inadequate. There is no Rumantsch version. FormatData_rm.java ?
  • 20. Java 12 - CAFE BABE 0000 0038 Files#mismatch Different content FileOne: ‘abcdef’ FileTwo: ‘abcd1f’ Same content FileOne: ‘abcdef’ FileTwo: ‘abcdef’ result = 4L result = -1L Different file size (encoding) FileOne: ‘Zürich’ FileTwo: ‘Zürich’ result = 1L (size of the file) Non existing file Files.mismatch (Paths.get(“null”), Paths.get(“null”)) -1L var result = Files.mismatch(pathFileOne, pathFileTwo); Nice but … watch out! /** * Finds and returns the position of the first mismatched byte in the content * of two files, or -1L if there is no mismatch.[...] */
  • 21. Java 12 - CAFE BABE 0000 0038 Collector#teeing - Example It collects a Stream using two independent collectors. The results are merged using a BiFunction Interesting small update. 'XX' Conferences: [Devoxx, Voxxed Days] 'One' Conferences: [Code One, Basel One] result var result = Stream.of("Devoxx", "Voxxed Days", "Code One", "Basel One") .collect(Collectors.teeing( // first collector Collectors.filtering(n -> n.contains("xx"), Collectors.toList()), // second collector Collectors.filtering(n -> n.endsWith("One"), Collectors.toList()), // merger - automatic type inference doesn't work here (List<String> list1, List<String> list2) -> List.of(list1, list2) )); System.out.println("'XX' Conferences: " + result.get(0)); System.out.println("'One' Conferences: " + result.get(1));
  • 22. Java 12 - CAFE BABE 0000 0038 Collectors teeing - Fun facts The etymology of teeing can help us to remember the name during our daily activity or to show our knowledge at the workplace. Teeing is originated from the plumbing tee! Wikipedia: ‘A tee, the most common pipe fitting, is used to combine (or divide) fluid flow.’ Linux has the tee command that splits the data! Among the authors we find Richard Stallman. Other names proposed for this feature: bisecting, duplexing, bifurcate, replicator, fanout, tapping, unzipping, tapping, collectionToBothAndThen, biCollecting, expanding, forking, etc. http://mail.openjdk.java.net/pipermail/core-libs-dev/2018-June/053987.html
  • 23. Java 12 - CAFE BABE 0000 0038 JEP 334 - JVM Constants API Class Visualizer generated diagrams Could be confusing. Don’t be surprised if your IDE will suggest these new methods: describeConstable, resolveConstantDesc. If you don’t work with constant pools ignore them. Constant pools documentation
  • 24. Java 12 - CAFE BABE 0000 0038 Constable#describeConstable and #resolveConstantDesc JEP 334 - JVM Constants API public interface Constable { /** * Returns an {@link Optional} containing the nominal descriptor for this * instance, if one can be constructed, or an empty {@link Optional} * if one cannot be constructed. [...] **/ Optional<? extends ConstantDesc> describeConstable(); } "Java 12".describeConstable(); // ==> Optional[Java 12]Example Not relevant for most of the devs. public interface ConstantDesc { /** * @param lookup The {@link MethodHandles.Lookup} to provide name resolution * and access control context * @return the resolved constant value [...] */ Object resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException; } "Java 12".resolveConstantDesc( null ); // ==> "Java 12"Example
  • 25. Java 12 - CAFE BABE 0000 0038 JEP 189 - Shenandoah (Experimental) Ultra-low pause, async GC. It doesn’t require a Full GC cycle. Great for containers and cloud. Disabled in Oracle builds... Shenandoah … but in RedHat buildssince JDK 8https://wiki.openjdk.java.net/display/shenandoah/Main Latency distribution
  • 26. Java 12 - CAFE BABE 0000 0038 JEP 189 - Shenandoah - Where to find it? $ java -XX:+UseShenandoahGC -version openjdk version "1.8.0_191" OpenJDK Runtime Environment (build 1.8.0_191-b12) OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode) In Red Hat Enterprise Linux OpenJDK since v1.8.0 and production ready! $ java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC -verbose:gc -version [0.005s][info][gc] Using Shenandoah openjdk version "12" 2019-03-19 OpenJDK Runtime Environment (build 12+33-Debian-1) OpenJDK 64-Bit Server VM (build 12+33-Debian-1, mixed mode, sharing) In Debian as experimental. $ java -XX:+UseShenandoahGC Error: VM option 'UseShenandoahGC' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions. $ java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC Error occurred during initialization of VM Option -XX:+UseShenandoahGC not supported Oracle builds don’t support it. https://bugs.openjdk.java. net/browse/JDK-8215030
  • 27. Java 12 - CAFE BABE 0000 0038 JEP 189 - Shenandoah - In depth Only for GC hackers The most detailed and technical presentation of Shenandoah is from Aleksey Shipilëv (Red Hat), the author of this GC. https://shipilev.net/talks/ javazone-Sep2018-shenandoah.pdf For starters Excellent GC introduction by Jelastic. They initiated and contributed to JEP 346. https://www.slideshare.net/jelastic/ elastic-jvm-automatic-vertical-scaling-of-the-java-heap
  • 28. Java 12 - CAFE BABE 0000 0038 Shenandoah has already similar features (experimental): -XX:+ShenandoahUncommit -XX:ShenandoahUncommitDelay JEP 346 - Promptly Return unused committed memory from G1 ● Improve GC in containers ● VM should detect phases of heap under-utilization to reduce the heap usage during this phase Feature initiated by Ruslan Synytsky (Jelastic) and Rodrigo Bruno (http://www.inesc-id.pt/). Improvement in heap usage! Containers focus!
  • 29. Java 12 - CAFE BABE 0000 0038 With the new approach the G1 stops and splits the collection if the amount of work required to collect live objects from the collection set exceeds the configured pause time limit. Previously, G1 had to collect all the live objects in a collection set without stopping. JEP 344 - Abortable Mixed Collection for G1 ● Introduces G1 collection pauses of configured/predictable length ● Increases the application throughput Improvements in G1 efficiency.
  • 30. Java 12 - CAFE BABE 0000 0038 ● Announced improvement of the startup time through the creation of a classes’ metadata list shared between JVM processes ● In previous versions java -Xshare:dump was required. dump generates jre/lib/server/classes.jsa binary file with the metadata ● JEP 341 - Default Class Data Sharing Archive CDS records in a file the classes’ metadata to use it with the JVM. It is possible to include the application classpath since JEP 310 (Java 10). The improvement could be noticeable in particular scenarios with multiple JVMs sharing the same metadata. CDS documentation. An informative article https://blog.codefx.org/java/application-class-data-sharing/ No noticeable improvement in modern scenarios Is it still relevant in a docker / kubernetes / microservices world?
  • 31. Java 12 - CAFE BABE 0000 0038 JEP internal JDK changes ● 230: Microbenchmark tools for JDK “Add a basic suite of microbenchmarks to the JDK source code, and make it easy for developers to run existing microbenchmarks and create new ones.” ● 340: One AArch64 Port “Remove all of the sources related to the arm64 port while retaining the 32-bit ARM port and the 64-bit aarch64 port.” Not relevant to us developers!
  • 32. Java 12 - CAFE BABE 0000 0038 Quo vadis JDK Mission Control 7? ● Promised final RC date: 02.01.2019 ● Still in Early-Access phase ● All previous downloads removed: http://jdk.java.net/jmc/ ● There are many unresolved issues, including the one reported by Jonatan: https://bugs.openjdk.java.net/browse/JMC-6195?jql=proje ct%20%3D%20JMC Promised … Not delivered! Missing leftover from JDK 11
  • 33. Java 12 - CAFE BABE 0000 0038 Which JDK ? 12 - rel. train ❏ Small new features ❏ 6 months of bug fixes ❏ 650 bug fixes ❏ JShell improvements ❏ Full backward compatibility ❏ GC improvements. Focus on containers and cloud! ❏ Test future LTS features 11 - LTS ❏ Follow LTS releases (11 -> 17) ❏ Framework/Server dependency ❏ Production environments
  • 34. Java 12 - CAFE BABE 0000 0038 So many options … choose your OpenJDK! Name / Editor Link Oracle jdk.java.net/12/ RedHat developers.redhat.com/products/openjdk Open J9 / Eclipse www.eclipse.org/openj9 Corretto / Amazon aws.amazon.com/corretto/ Zulu / Azul www.azul.com/ AdoptOpenJDK / IBM, Clarity, etc. adoptopenjdk.net SapMachine / SAP sap.github.io/SapMachine/ Linux distribution Linux distribution You Your laptop Excellent info here: https://medium.com/@javachampions/java-is-still-free-2-0-0-6b9aa8d6d244
  • 35. Java 12 - CAFE BABE 0000 0038 Q&A What’s this thing? Coffee? Guess and check in the last slide! Jonatan’s GitHub, with more examples and tech details: https://github.com/jonatan-kazmierczak/ java-new-features/ Java Zurich Meetup: https://www.meetup.com/Java-Switzerland/ Marco’s blog and twitter: https://javaee.ch @marcomolteni Links
  • 36. Java 12 - CAFE BABE 0000 0038 https://en.wikipedia.org/wiki/Java_class_file JSR 202 Java 12 = Class Format Version 56 (0x38 hex) Compiled Java classes start with a magic number in hex: CAFE BABE followed by the minor version number of the class file major version number of the class file. Java 12 will have the major version of class format = 56. Remember it if you see: Exception in thread "main" java.lang.UnsupportedClassVersionError: Example has been compiled by a more recent version of the Java Runtime (class file version 56.0), this version of the Java Runtime only recognizes class file versions up to 55.0 > hexdump -C Example.class 00000000 ca fe ba be 00 00 00 38 00 1c 0a 00 06 00 0e 09 |.......7........| 00000010 00 0f 00 10 08 00 11 0a 00 12 00 13 07 00 14 07 |................| 00000020 00 15 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29 |.....<init>...()| 00000030 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e |V...Code...LineN| 00000040 75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 |umberTable...mai| 00000050 6e 01 00 0a 53 6f 75 72 63 65 46 69 6c 65 01 00 |n...SourceFile..| 00000060 0c 45 78 61 6d 70 6c 65 2e 6a 61 76 61 0c 00 07 |.Example.java...|