Rumble in the

 

Jungle

Volker Simonis, SAP / volker.simonis@gmail.com

https://simonis.github.io/FOSDEM2019

What is Java ?

  1. Programming Language
  2. Virtual Machine / Runtime
  3. Class Library / API
  1.  
  2.  
  3.  
  1.  
  2. Java Platform
  3.  

JCP - Java Community Process

JCK - Java Compatibility Kit

  • TCK for Java SE conformance certification
  • Available only to commercial Java licensees or
  • OpenJDK Community TCK License Agreement (OCTLA)
  • Complex (~140_000 tests, JCK 6 Users Guide ~300p)
  • Conformance ≠ Quality !

JEP vs. JSR

  • There's one umbrella JSR per Java release
    • New Features are developed in the OpenJDK
  • JEP - JDK Enhancement-Proposal & Roadmap Process
    • Still dominated by Oracle:
    • Requires endorsement and funding by Group Leads
    • The OpenJDK Lead (appointed by Oracle) ultimately
      decides which JEPs to include into the Roadmap.
  • Three kinds of JEPs: SE - JDK - Implementation

Java 9

102: Process API Updates
110: HTTP 2 Client
143: Improve Contended Locking
158: Unified JVM Logging
165: Compiler Control
193: Variable Handles
197: Segmented Code Cache
199: Smart Java Compilation, Phase Two
200: The Modular JDK
201: Modular Source Code
211: Elide Deprecation Warnings on Import Statements
212: Resolve Lint and Doclint Warnings
213: Milling Project Coin
214: Remove GC Combinations Deprecated in JDK 8
215: Tiered Attribution for javac
216: Process Import Statements Correctly
217: Annotations Pipeline 2.0
219: Datagram Transport Layer Security (DTLS)
220: Modular Run-Time Images
221: Simplified Doclet API
222: jshell: The Java Shell (Read-Eval-Print Loop)
223: New Version-String Scheme
224: HTML5 Javadoc
225: Javadoc Search
226: UTF-8 Property Files
227: Unicode 7.0
228: Add More Diagnostic Commands
229: Create PKCS12 Keystores by Default
231: Remove Launch-Time JRE Version Selection
232: Improve Secure Application Performance
233: Generate Run-Time Compiler Tests Automatically
235: Test Class-File Attributes Generated by javac
236: Parser API for Nashorn
237: Linux/AArch64 Port
238: Multi-Release JAR Files
240: Remove the JVM TI hprof Agent
241: Remove the jhat Tool
243: Java-Level JVM Compiler Interface
244: TLS Application-Layer Protocol Negotiation Extension
245: Validate JVM Command-Line Flag Arguments
246: Leverage CPU Instructions for GHASH and RSA
247: Compile for Older Platform Versions
248: Make G1 the Default Garbage Collector
249: OCSP Stapling for TLS
250: Store Interned Strings in CDS Archives
251: Multi-Resolution Images
252: Use CLDR Locale Data by Default
253: Prepare JavaFX UI Controls & CSS APIs for Modularization
254: Compact Strings
255: Merge Selected Xerces 2.11.0 Updates into JAXP
256: BeanInfo Annotations
257: Update JavaFX/Media to Newer Version of GStreamer
258: HarfBuzz Font-Layout Engine
259: Stack-Walking API
260: Encapsulate Most Internal APIs
261: Module System
262: TIFF Image I/O
263: HiDPI Graphics on Windows and Linux
264: Platform Logging API and Service
265: Marlin Graphics Renderer
266: More Concurrency Updates
267: Unicode 8.0
268: XML Catalogs
269: Convenience Factory Methods for Collections
270: Reserved Stack Areas for Critical Sections
271: Unified GC Logging
272: Platform-Specific Desktop Features
273: DRBG-Based SecureRandom Implementations
274: Enhanced Method Handles
275: Modular Java Application Packaging
276: Dynamic Linking of Language-Defined Object Models
277: Enhanced Deprecation
278: Additional Tests for Humongous Objects in G1
279: Improve Test-Failure Troubleshooting
280: Indify String Concatenation
281: HotSpot C++ Unit-Test Framework
282: jlink: The Java Linker
283: Enable GTK 3 on Linux
284: New HotSpot Build System
285: Spin-Wait Hints
287: SHA-3 Hash Algorithms
288: Disable SHA-1 Certificates
289: Deprecate the Applet API
290: Filter Incoming Serialization Data
291: Deprecate the Concurrent Mark Sweep (CMS) GC
292: Implement Selected ECMAScript 6 Features in Nashorn
294: Linux/s390x Port
295: Ahead-of-Time Compilation
297: Unified arm32/arm64 Port
298: Remove Demos and Samples
299: Reorganize Documentation

Java 9

102: Process API Updates
110: HTTP/2 Client (Incubator)
143: Improve Contended Locking
158: Unified JVM Logging
165: Compiler Control
193: Variable Handles
197: Segmented Code Cache
199: Smart Java Compilation, Phase Two
200: The Modular JDK
201: Modular Source Code
211: Elide Deprecation Warnings on Import Statements
212: Resolve Lint and Doclint Warnings
213: Milling Project Coin
214: Remove GC Combinations Deprecated in JDK 8
215: Tiered Attribution for javac
216: Process Import Statements Correctly
217: Annotations Pipeline 2.0
219: Datagram Transport Layer Security (DTLS)
220: Modular Run-Time Images
221: New Doclet API
222: jshell: The Java Shell (Read-Eval-Print Loop)
223: New Version-String Scheme
224: HTML5 Javadoc
225: Javadoc Search
226: UTF-8 Property Resource Bundles
227: Unicode 7.0
228: Add More Diagnostic Commands
229: Create PKCS12 Keystores by Default
231: Remove Launch-Time JRE Version Selection
232: Improve Secure Application Performance
233: Generate Run-Time Compiler Tests Automatically
235: Test Class-File Attributes Generated by javac
236: Parser API for Nashorn
237: Linux/AArch64 Port
238: Multi-Release JAR Files
240: Remove the JVM TI hprof Agent
241: Remove the jhat Tool
243: Java-Level JVM Compiler Interface
244: TLS Application-Layer Protocol Negotiation Extension
245: Validate JVM Command-Line Flag Arguments
246: Leverage CPU Instructions for GHASH and RSA
247: Compile for Older Platform Versions
248: Make G1 the Default Garbage Collector
249: OCSP Stapling for TLS
250: Store Interned Strings in CDS Archives
251: Multi-Resolution Images
252: Use CLDR Locale Data by Default
253: Prepare JavaFX UI Controls & CSS APIs for Modularization
254: Compact Strings
255: Merge Selected Xerces 2.11.0 Updates into JAXP
256: BeanInfo Annotations
257: Update JavaFX/Media to Newer Version of GStreamer
258: HarfBuzz Font-Layout Engine
259: Stack-Walking API
260: Encapsulate Most Internal APIs
261: Module System
262: TIFF Image I/O
263: HiDPI Graphics on Windows and Linux
264: Platform Logging API and Service
265: Marlin Graphics Renderer
266: More Concurrency Updates
267: Unicode 8.0
268: XML Catalogs
269: Convenience Factory Methods for Collections
270: Reserved Stack Areas for Critical Sections
271: Unified GC Logging
272: Platform-Specific Desktop Features
273: DRBG-Based SecureRandom Implementations
274: Enhanced Method Handles
275: Modular Java Application Packaging
276: Dynamic Linking of Language-Defined Object Models
277: Enhanced Deprecation
278: Additional Tests for Humongous Objects in G1
279: Improve Test-Failure Troubleshooting
280: Indify String Concatenation
281: HotSpot C++ Unit-Test Framework
282: jlink: The Java Linker
283: Enable GTK 3 on Linux
284: New HotSpot Build System
285: Spin-Wait Hints
287: SHA-3 Hash Algorithms
288: Disable SHA-1 Certificates
289: Deprecate the Applet API
290: Filter Incoming Serialization Data
291: Deprecate the Concurrent Mark Sweep (CMS) GC
292: Implement Selected ECMAScript 6 Features in Nashorn
294: Linux/s390x Port
295: Ahead-of-Time Compilation
297: Unified arm32/arm64 Port
298: Remove Demos and Samples
299: Reorganize Documentation
Java 10
286: Local-Variable Type Inference
296: Consolidate the JDK Forest into a Single Repository
307: Parallel Full GC for G1
310: Application Class-Data Sharing
312: Thread-Local Handshakes
313: Remove the Native-Header Generation Tool (javah)
314: Additional Unicode Language-Tag Extensions
316: Heap Allocation on Alternative Memory Devices
317: Experimental Java-Based JIT Compiler
319: Root Certificates
322: Time-Based Release Versioning
Java 12
189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
230: Microbenchmark Suite
325: Switch Expressions (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
Java 11
181: Nest-Based Access Control
309: Dynamic Class-File Constants
315: Improve Aarch64 Intrinsics
318: Epsilon: A No-Op Garbage Collector (Experimental)
320: Remove the Java EE and CORBA Modules
321: HTTP Client (Standard)
323: Local-Variable Syntax for Lambda Parameters
324: Key Agreement with Curve25519 and Curve448
327: Unicode 10
328: Flight Recorder
329: ChaCha20 and Poly1305 Cryptographic Algorithms
330: Launch Single-File Source-Code Programs
331: Low-Overhead Heap Profiling
332: Transport Layer Security (TLS) 1.3
333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
335: Deprecate the Nashorn JavaScript Engine
336: Deprecate the Pack200 Tools and API

Preview Features & Incubator Modules

  • JEP 11: Incubator Modules
    • Ship non-final APIs to developers to get feedback
    • Modules/Packages in jdk.incubator
    • API must be finalized, substantially improved or removed
    • Not part of the Java SE standard!
  • JEP 12: Preview Language and VM Features
    • Fully specified and implemented, yet impermanent
    • Part of Java SE, checked by the corresponding TCK
    • Disabled by default (use --enable-preview flag)

OpenJDK

  • Java SE reference implementation (since Java 7)
  • GPLv2 plus Classpath Exception
  • "Source-only" project (until Java 8)
    • Since Java 9 binaries for Linux, MacOS, Windows
      ⇒ Two updates only!
  • Binary distributions from various vendors

OpenJDK Updates Projects

Oracle JDK

  • Derived from Open JDK
    • had non - Java SE addons (e.g. JavaFX, WebStart)
    • and commercial features
      (e.g. FlightRecorder, MissionControl)
  • Under Oracle Binary Code License (until 8u202)
    • Allows commercial use but
      ⇒ Field of Use restrictions may apply
  • Under Oracle Technology Network License (after 8u202)
    • Only for personal / development use!

Java Versioning

Java Versioning

              
$ ./oraclejdk-11/bin/java -version
java version "11" 2018-09-25    
Java(TM) SE Runtime Environment 18.9 (build 11+28)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11+28, mixed mode)
$ ./oraclejdk-11.0.2/bin/java -version
java version "11.0.2" 2019-01-15 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.2+9-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.2+9-LTS, mixed
              
            
              
$ ./openjdk-11/bin/java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
$ ./openjdk-11.0.2/bin/java -version                             
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
              
            

Java / OpenJDK Release Model

  • A new Java (i.e. "Feature") Release every 6 month
  • "Updates" a month later & every 3 months thereafter
    • OpenJDK: at least two updates (Short Term Support)
    • Implementers my choose (Mid-/Long-Term Support)
    • Contain Security / Bug Fixes & Enhancements
  • OpenJDK Vulnerability Group coordinates Security Fixes

IcedTea

  • Maintained by Red Hat
    • Supported through General Support Contract
  • Java 7 to 11
  • First OpenJDK "build harness"
  • Base of most Linux OpenJDK packages
  • Extra features (e.g. Shenandoah, IcedTea-Web)
    and platforms (e.g Aarch64)
  • Windows version available

AdoptOpenJDK / OpenJ9

  • Maintained by the AdoptOpenJDK Community
  • Prebuilt HotSpot and OpenJ9 binaries
  • Java 8 to 11
  • Linux, Windows, MacOS, Solaris, AIX
  • x64, x64, Aarch64, Sparc, s390x, ppc64le
  • Pure down-stream build with own build & test harness
  • IBM offers support for OpenJ9 based releases

Zulu Enterprise & Zulu Embedded

  • Maintained by Azul (commercial support available)
  • Java 6 to 11 (with OpenJFX)
  • Linux, Alpine, Windows, MacOS, Solaris, QNX
  • x64, x64, SPARC, ARM, Aarch64, Mips, ppc32
  • LTS and MTS (Medium Term Support)
  • Private source development model

Corretto

  • Maintained by Amazon
    • Supported through General Support Contract
  • Currently only 8, 11 planned for mid-2019
  • LTS support on Linux, Windows, MacOS
  • Open GitHub repo with a few add-ons and fixes

Liberica

  • Maintained by Bell-Soft (commercial support available)
  • Java 8 to 11 (with OpenJFX)
  • Linux, Alpine, Windows, MacOS, Solaris
  • x64, x64, SPARC, ARM, Aarch6

SapMachine

  • Maintained by SAP
    • Supported through General Support Contract
  • Java 10, 11, ...
  • Linux, Windows, MacOS
  • x64, ppc64, ppc64le
  • GitHub repo with a few add-ons and fixes

Others

Commercial JDKs

How to choose your favorite JDK?

  • Supported Java versions
  • Supported platforms (Linux OS/GlibC)
  • Support & Maintenance time frames
  • Free vs. Paid
  • OpenJDK involvement / Openness

JDK 11 Fix Ratio

OpenJDK Fix Ratio

(c) Dalibor Topic, "Building JDK 11 Together"

Summary

  • Java OpenJDK is alive and kicking!
  • You have the choice which distribution to use!
    • OpenJ9 a great, alternative VM
  • Competition is good - Collaboration as well :)
  • A proprietary JCK will become dispensable:
    • Java is a mature platform
    • OpenJDK class library used everywhere

https://simonis.github.io/FOSDEM2019