Rumble in the

 

Jungle

Basada en la presentación original de Volker Simonis, SAP / volker.simonis@gmail.com

https://simonis.github.io/FOSDEM2019

(ES) https://tuxtor.github.io/RumbleInTheJavaJungle/

¿Que es Java ?

  1. Lenguaje de programación
  2. Maquina virtual / Entorno de ejecución
  3. Bibliotecas / API
  1.  
  2.  
  3.  
  1.  
  2. Java Platform
  3.  

JCP - Java Community Process

JCK - Java Compatibility Kit

  • TCK para Java SE es una certificación de conformidad
  • Disponible a implementadores con licencia de Java o
  • OpenJDK Community TCK License Agreement (OCTLA)
    • Unicamente para implementaciones con licencia GPL
      substancialmente derivadas de OpenJDK
    • Ver Oracle vs. AdoptOpenJDK
    • Código cerrado; Acuerdo OCTLA ⇒ NDA
  • Complejo (~140_000 pruebas, JCK 6 Users Guide ~300p)
  • Conformidad ≠ Calidad !

JEP vs. JSR

  • Existe una JSR grupo para cada lanzamiento de Java
    • Nuevas características son desarrolladas en OpenJDK
  • JEP - JDK Enhancement-Proposal & Roadmap
    • Aun liderado/dominado por Oracle:
    • Requiere aval y financiamiento por los Group Leads
    • El lider de OpenJDK (elegido por Oracle) es el que al final
      decide cuales JEPs se incluyen en el Roadmap.
  • Tres tipos de JEP: 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

Características previas y módulos en incubación

  • JEP 11: Incubator Modules
    • Entrega APIs preliminares a los desarrolladores para obtener retroalimentación
    • Modulos/Paquetes en jdk.incubator
    • API debe ser finalizada, mejorada o elminada
    • ¡No es parte del standard Java SE!
  • JEP 12: Preview Language and VM Features
    • Totalmente especificada e implementada, pero no permanente
    • Parte de Java SE, verificada por su correspondiente TCK
    • Deshabilitados por defecto (habilitar con --enable-preview)

OpenJDK

  • Implementación de referencia para Java SE (desde Java 7)
  • GPLv2 con Classpath Exception
  • Proyecto de código fuente (hasta Java 8)
    • Desde Java 9 se generan binarios para Linux, MacOS, Windows
      ⇒ ¡Dos actualizaciones unicamente!
  • Distribuciones binarias de varios proveedores

OpenJDK Updates Projects

Oracle JDK

  • Derivado de Open JDK
    • anteriormente - Java SE addons (e.g. JavaFX, WebStart)
    • y características comerciales
      (e.g. FlightRecorder, MissionControl)
  • Bajo Oracle Binary Code License (hasta 8u202)
    • Permite usos comerciales pero
      ⇒ Aplican ciertas restricciones
  • Bajo Oracle Technology Network License (después de 8u202)
    • ¡Solamente para desarrollo / uso personal!

Versionamiento en Java

Versionamiento en Java

              
$ ./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)
              
            

Modelo de lanzamiento Java / OpenJDK

  • Un nuevo Java (i.e. "Feature") lanzado cada 6 meses
  • "Actualizaciones" un mes después & cada 3 meses en adelante
    • OpenJDK: al menos dos actualizaciones (Short Term Support)
    • Implementadores puede elegir (Mid-/Long-Term Support)
    • Contiene parches de seguridad / corrección de errores & mejoras
  • OpenJDK Vulnerability Group coordina las mejoras en seguridad

IcedTea

  • Mantenido por Red Hat
    • Soportado a través de un contrato general de soporte
  • Java 7 hasta 11
  • Primer OpenJDK "build harness"
  • La base de la mayoría de paquetes Linux OpenJDK
  • Características extra (e.g. Shenandoah, IcedTea-Web)
    y plataformas (e.g Aarch64)
  • Versión para Windows disponible

AdoptOpenJDK / OpenJ9

  • Mantenido por la comunidad AdoptOpenJDK
  • Binarios precompilados de HotSpot y OpenJ9
  • Java 8 hasta 11
  • Linux, Windows, MacOS, Solaris, AIX
  • x64, x64, Aarch64, Sparc, s390x, ppc64le
  • Complilación down-stream con su propio set de pruebas
  • IBM ofrece soporte para lanzamientos basados en Open J9

Zulu Enterprise & Zulu Embedded

  • Mantenido por azul (soporte comercial disponible)
  • Java 6 hasta 11 (con OpenFX)
  • Linux, Alpine, Windows, MacOS, Solaris, QNX
  • x64, x64, SPARC, ARM, Aarch64, Mips, ppc32
  • LTS y MTS (Medium Term Support)
  • Modelo de desarrollo de código privado

Corretto

  • Mantenido por Amazon
    • Soportado a través de contrato general de soporte
  • Actualmente Java 8, 11 planificado para Q2 2019
  • LTS en Linux, Windows, MacOS
  • Repositorio de GitHub abierto con correcciones y mejoras

Liberica

  • Mantenido por Bell-Soft (soporte comercial disponible)
  • Java 8 hasta 11 (con OpenFX)
  • Linux, Alpine, Windows, MacOS, Solaris
  • x64, x64, SPARC, ARM, Aarch6

SapMachine

  • Mantenido por SAP
    • Soportado a través de contrato general de soporte
  • Java 10, 11, ...
  • Linux, Windows, MacOS
  • x64, ppc64, ppc64le
  • Repositorio de GitHub con correcciones y mejoras

Otros

JDKs comerciales

¿Como elegir tu JDK?

  • Versiones de Java soportadas
  • Plataformas soportadas (Linux OS/GlibC)
  • Ventanas de mantenimiento y soporte
  • Gratis vs. pagado
  • Apertura e involucramiento en OpenJDK

Taza de mejoras en JDK 11

OpenJDK Fix Ratio

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

Sumario

  • Java ¡OpenJDK esta vivo y coleando!
  • ¡Existe la posiblidad de elegir tu distribución!
    • OpenJ9 una VM alternativa genial
  • La competencia es buena - la colaboración también :)
  • Un JCK propietario sera dispensable:
    • Java es una plataforma madura
    • Las bibliotecas de OpenJDK son utilizadas en todas partes

https://simonis.github.io/FOSDEM2019

(ES) https://tuxtor.github.io/RumbleInTheJavaJungle/