En el mundo de java las cosas están cambiando y comienzan a moverse con más velocidad. Java 10 acaba de ser liberado obedeciendo un nuevo modelo de lanzamientos semestrales en oracle.
Algo que tenemos que tomar en cuenta es que tanto Java 9, como Java 10 no son versiones que se vayan a soportar a largo plazo. La última versión de soporte de largo plazo (LTS) fue Java 8, y la siguiente es Java 11. Por lo tanto java el soporte para java 9 termina donde empieza el de Java 10. Así que si no les urge pueden esperar a Java 11 para hacer el salto desde la 8 y estar en la versión LTS siempre.
No obstante, Java 10 introduce varias características muy notables las cuales trato de resumir a continuación:
Inferencia de tipos en variables locales
La nueva inferencia de tipos introduce la palabra reservada var para declarar variables locales e inferir su tipo.
var list = new ArrayList<String>(); // infiere ArrayList<String> var stream = list.stream(); // infiere Stream<String>
En resumen esto solo funciona en un ámbito local y con variables inicializadas.
Consolidar todos los repositorios del JDK en uno solo
Hasta Java 9 se tenían 8 repositorios en mercurial: root, corba, hotspot, jaxp, jaxws, jdk, langtools, and nashorn. Estos han sido consolidados en uno mismo para efectos de hacer cambios de manera más rápida y agilizar la gestión de la configuración.
Una interfaz limpia y unificada para el GarbageCollector
Esta interfaz está definida por la clase CollectedHeap que todos los GarbageCollectors implementan. La clase CollectedHeap dirigirá la mayoría de los aspectos de interacción entre el colector y el resto del HotSpot. Más específicamente una implementación de un GarbageCollector tendrá que proveer lo siguiente:
- Un heap, que sea una subclase de CollectedHeap
- Un barrier set, que sea una subclase de BarrierSet, que implemente algún barrier en tiempo de ejecución.
- Una implementación de CollectorPolicy
- Una implementación de GCInterpreterSupport, Que implementa las barreras que GC provee para el intérprete usando instrucciones de assembler.
- Una implementación de GCC1Support, Que implemente las barreras de un GC para el compilador C1
- Una implementación de GCC2Support,Que implemente las barreras de un GC para el compilador C2
- La inicialización de argumentos específicos eventuales del GC
- Configurar un MemoryService, los memory pools relacionados, gestores de memoria, etc.
GarbageCollection en paralelo para G1
Actualmente el garbage collector utiliza solo un hilo para ejecutar un algoritmo mark-sweep-compact la intención con esta característica es que cuando G1 es que cuando los colectores concurrentes no puedan terminar sus tareas lo suficientemente rápido exista un colector funcionando en paralelo para asistir en la tarea.
Se puede configurar la cantidad de hilos para GC usando el argumento -XX:ParallelGCThreads
Mejoras en el CDS (Class-Data Sharing)
Se logró reducir drásticamente el uso de memoria RAM al optimizar la metadata que estaba siendo utilizada por mas de una clase, esto además mejoró el tiempo en que las aplicaciones inician.
Thread Local-Handshakes
Introduce una forma de ejecutar un callback en subprocesos sin realizar un punto de chequeo global en máquina virtual. Esto hace que sea posible y económico detener los hilos de forma individual y no solo todos los hilos o ninguno.
Se elimina la herramienta de generación de encabezado nativo (javah)
La herramienta ha sido reemplazada por una funcionalidad superior en javac, agregada en JDK 8. Esta funcionalidad proporciona la capacidad de escribir archivos de encabezados nativos en el momento en que se compila el código fuente de Java, eliminando así la necesidad de una herramienta separada.
Centrándose en el soporte proporcionado por javac elimina la necesidad de actualizar javah para admitir los paradigmas recientes, como el acceso API a través de la API del compilador en javax.tools. *, O el nuevo SPI java.util.spi.ToolProvider agregado en JDK 9.
Extensiones de etiquetas de idioma Unicode adicionales
Se mejoró java.util.Locale y sus API relacionadas para implementar extensiones Unicode adicionales de etiquetas de idioma. A partir de Java 10 se soportará las siguientes etiquetas de lenguaje:
- cu (tipo de divisa currency)
- fw (primer dia de la semana)
- rg (Sobre-escribir región)
- tz (zona horaria)
Asignación de memoria en dispositivos de memoria alternativos
Se habilita la máquina virtual HotSpot para asignar espacio de memoria de objetos de Java en un dispositivo de memoria alternativo. Como por ejemplo: NV-DIMM
Compilador experimental JIT basado en Java
Permite que el compilador JIT basado en Java, Graal, se use como un compilador JIT experimental en la plataforma Linux / x64.
Certificados Root
Proporciona un conjunto predeterminado de certificados de autoridad de certificación (CA) raíz en el JDK.
Versionamiento de releases basados en la fecha
Revisa el esquema del string de versión de Java SE Platform y el JDK, y la información de versiones relacionada, para los modelos de versiones actuales y futuros basados en el tiempo.
Conclusión
Lo más emocionante, desde el punto de vista del desarrollador, de este nuevo release es la inferencia de tipos. Lo demás fueron optimizaciones que hace que el ya poderoso JDK sea aún más rápido y eficiente 🙂
[…] defecto Java no tenia forma de conocer que estaba corriendo en un contenedor. Con el lanzamiento de Java 10, la máquina virtual de java ahora tiene forma de conocer las restricciones que el contenedor le […]