Nuevas características de Java 10 y Java 11

Nuevas características de Java 10 y Java 11

Introducción:

Java 10 y Java 11

El contenido del blog es para revisar las nuevas características que se agregan en estas nuevas versiones de Java. No repasaré todas las funciones, pero explicaré algunas de las más importantes que te afectarán a ti y a tus programas java. Por ejemplo, Java 10 introduce una nueva versión de Cadence, así como un nuevo identificador para las variables locales, mientras que Java 11 nos permite lanzar programas de código fuente de un solo archivo y estandarizar la API del cliente http. En java 11, ejecutará el código fuente de Java directamente utilizando el intérprete de Java.


El lanzador de Java lanza el archivo de clase, la clase principal del archivo Jar, la clase principal del módulo y lanza una clase declarada en un archivo SRC. En realidad, el código fuente se compila en la memoria y lo ejecuta el intérprete.

Ahora, tendrá una pregunta en su mente sobre dónde aprenderá todas las nuevas funciones que se han lanzado. Puede ir a openjdk.java.net/projects/jdk/10 y luego a / 11 para las nuevas funciones de Java 11 respectivamente. Cuando visite el sitio web, verá muchos números y siglas como JSR y JEP.

Siglas JSR y JEP:

  • JSR significa solicitud de especificación de Java. Un JSR describe las especificaciones propuestas y finales para la plataforma Java. Un JSR puede contener varias características dentro de él, y al hacer clic en este, puede ver el JSR general que contiene todas las características organizadas debajo.
  • En el mundo de Java, cada característica se llama JEP o una propuesta de mejora de JDK. Cada una de las nuevas funciones es un JEP. Probablemente estará familiarizado con el JDK, que es el kit de desarrollo de Java para desarrollar las aplicaciones de Java. Ahora, para mantener las características propuestas organizadas e identificables, cada JSR y JEP tiene un número asociado y ahí es donde entran estos números. Consulte la captura de pantalla siguiente:
  • Por ejemplo, en Java 11, JEP 328 se refiere a Flight Recorder como puede ver en la imagen de arriba. Muchas de las características introducidas en Java 100 y Java 11 involucran JVM (máquina virtual Java). JVM es la que permite a una computadora ejecutar programas Java y otros programas compilados en código de bytes de Java interpretando este código de bytes.

NUEVO en Java 10:

Inferencia de tipo de variable local:

Esta función de java 10 va a cambiar la forma en que codifica en java. Esencialmente, está agregando algo de azúcar sintáctico a Java, simplificándolo y mejorando la experiencia del desarrollador. La nueva sintaxis reducirá el vocabulario y la verbosidad asociados con la escritura de Java mientras mantiene su compromiso con la seguridad de tipo estático.

La inferencia de tipo de variable local significa que puede declarar variables sin tener que especificar el tipo asociado. Ahora, en lugar de especificar el tipo de datos antes del nombre de la variable, podemos simplemente decir var.

Antes de Java 10:

List <String> list = new ArrayList <String> ();

int t = 12;

Aquí iríamos una lista que contiene una cadena

En java 10:

Con Java 10, aquí, en lugar de decir int, en lugar de especificar qué tipo de datos queremos que contenga la variable, podemos usar var. El tipo se infiere del contexto. En java 10, si queremos declarar una variable entera o una variable flotante entonces no usamos para especificar el tipo y simplemente podemos usar la palabra clave “var” y podemos asignar el valor

var list = new ArrayList <String> ();

var t = 12;

Cuando dices que var language es igual a java (var language = “java”), el compilador de Java ya sabrá que el tipo es string. También es importante recordar que Java sigue siendo un lenguaje de tipo estático y una vez que se asigna el tipo, no se puede cambiar. Esto significa que no podemos escribir (idioma = 3) porque el compilador ya sabe que el tipo de idioma es una cadena y si lo asigna a un entero en la siguiente línea, no lo permitirá.

Esta característica reduce la cantidad de código de placa de caldera necesario para declarar variables locales en java. Ahora, var no es una palabra clave general. Es un nombre de tipo reservado o una palabra clave sensible al contexto. Esto significa que el código que usa var como variable, método o nombre de paquete no se verá afectado. Sin embargo, el código que usa var como clase o nombre de interfaz se verá afectado.

Usar var como nombre para cualquiera de estas cosas es bastante raro en la práctica, pero de todos modos, ya que viola las convenciones de nomenclatura habituales. Ahora, ¿cuánto afectará esto realmente a su código? La interfaz de tipo de variable local estará restringida a variables locales con inicializadores, índices en el bucle mejorado, bucle for y locales inicializados en un bucle for tradicional. Ex:

Inicializadores: var me = “Mi nombre”;

Índices para bucle for mejorado: for (var s: myArray) {…};

Variables locales inicializadas en el bucle for tradicional: for (var i = 0; i <10; i ++) {…};

Debido al compromiso de Java de admitir versiones anteriores de Java, podemos asumir que no romperá la compatibilidad con versiones anteriores. Entonces, ahora surge la pregunta ¿qué no funciona con la inferencia de variable de tipo local? Debes inicializar tu variable y no puedes simplemente declararla. Además, la inferencia de tipo de variable local no estará disponible para parámetros de método, parámetros de constructor, parámetros de método de tipos de retorno de servicios de desarrollo de Java , campos o cualquier otro tipo de declaración de variable. Si bien la inferencia de tipos no es un concepto nuevo en Java, es un concepto nuevo para las variables locales. Comenzó en java 5 con genéricos y luego se expandió en java 7 como parte de Project Coin con Diamond Operator.

Como sabe, el operador de diamante nos permite simplificar el código para que no tengamos que especificar dos veces el tipo de datos que la lista o la lista de arreglos contendrían. Solo tenemos que hacerlo una vez (List <String> list = new ArrayList <> ();)

Mejoras en la recolección de basura:

En Java 10, obtenemos algunas mejoras en la recolección de basura. En esta nueva versión, obtenemos una interfaz de recolector de basura, que aumenta el aislamiento del código de diferentes recolectores de basura. Facilita la exclusión de un recolector de basura de una compilación de JDK y, al mismo tiempo, permite agregar un nuevo recolector de basura sin afectar la base del código.

¿Qué significa esto? En versiones anteriores de Java, había fragmentos de archivos fuente de recolectores de basura dispersos por todas las fuentes de HotSpot. Esto se convirtió en un problema al implementar un nuevo recolector de basura, ya que los desarrolladores deben saber dónde buscar esos archivos fuente. Uno de los principales objetivos de esta función es introducir una mejor modularidad para el código del recolector de basura interno de HotSpot, tener una interfaz de recolector / basura más limpia y facilitar la implementación de nuevos recolectores.

Antes de pasar a nuestra próxima función nueva, piense en limpiar su hogar. Si tienes que hacerlo, harás la mínima cantidad de limpieza para que luzca presentable. No limpiará toda su casa todos los días porque eso requeriría muchos recursos y tiempo. Sin embargo, a veces es necesaria una limpieza profunda. Garbage Collection también es kike this.

En java 9, el recolector de basura Garbage-First se convirtió en el recolector de basura predeterminado para la JVM, que fue diseñado para evitar la recolección de basura completa. Sin embargo, cuando las colecciones concurrentes no pudieran recuperar la memoria lo suficientemente rápido, terminarían recurriendo a los recolectores de basura completos, todos en un solo hilo, creando latencias. En Java 10, el recolector de basura completo ahora es paralelo. Esto significa que estas latencias se reducen porque se puede usar la misma cantidad de subprocesos que en las colecciones actuales, lo que en última instancia mejora el rendimiento general. Cuando tenemos que hacer nuestra limpieza profunda, ahora es más eficiente.

Asignación de memoria a dispositivos alternativos:

Antes de entrar en esta función, hablemos sobre la máquina virtual HotSpot. La máquina virtual HotSpot es un componente central de la plataforma Java SE. Implementa la especificación de la máquina virtual Java y es accesible como una biblioteca compartida en JRE. Proporciona recursos en tiempo de ejecución de Java e incluye compiladores dinámicos que compilan de forma adaptativa códigos de bytes de Java en instrucciones optimizadas de la máquina. HotSpot VM también administra el montón de Java mediante la recolección de basura y proporciona datos a las herramientas de generación de perfiles, monitoreo y depuración.

HotSpot también es JVM ergonómico, lo que significa que se basa en la configuración de la plataforma, selecciona un compilador, una configuración de montón de Java y un recolector de basura que producen un rendimiento de bueno a excelente para la mayoría de las aplicaciones. Sin embargo, en circunstancias especiales, es posible que se requiera un ajuste específico para obtener el mejor rendimiento y ahí es donde entran las nuevas características.

En Java 10, HotSpot VM ahora puede asignar el montón de objetos java en un dispositivo de memoria alternativo especificado por el usuario. Ahora, ¿por qué esto es bueno? Con la disponibilidad de memoria dual en línea no volátil barata, los sistemas futuros pueden tener arquitecturas de memoria heterogéneas que, además de la memoria dinámica de acceso aleatorio, tendrán un tipo más de memoria no DRAM. Esta función se dirige a dispositivos de memoria alternativos que tienen la misma semántica que DRAM.

Uso compartido de datos de clases de aplicaciones:

Antes de entrar en esta función, permítame explicarle el intercambio de datos de clase (CDS). CDS trata sobre los archivos de clase de Java y permite preprocesar un conjunto de archivos de clase en un archivo de almacenamiento compartido.

Ahora surge la pregunta ¿por qué querrías hacer esto?

Cada vez que la JVM carga una clase, debe analizar la clase, almacenarla en una estructura interna, realizar algunas comprobaciones y más. Solo después de todo esto, la clase está lista para comenzar. Estos pasos toman tiempo, especialmente cuando sabemos que ciertas clases de sistema como String, Integer, URL connection y más están incluidas en Java de forma predeterminada. Estas clases también requieren memoria, por lo que cuando tenemos un archivo compartido que contiene clases preprocesadas, se puede mapear en memoria en tiempo de ejecución, lo que reduce el tiempo de inicio y la huella de memoria si varias JVM comparten el mismo archivo.

CDS es parte de Java desde Java 5. Ahora, ¿cuál es la nueva característica? Con CDS, solo el cargador de clases bootstrap puede cargar las clases archivadas. Application CDS, también llamado AppCDS extiende CDS y permite que otros cargadores de clases carguen las clases logradas. Algunos otros cargadores de clases incluyen el cargador de clases del sistema integrado o el cargador de clases de aplicaciones y el cargador de clases de plataforma integrado.

Muchas aplicaciones empresariales de gran escala a menudo cargan decenas de miles de clases en el sistema o cargador de clases de aplicaciones. La aplicación de AppCDS a estas aplicaciones dará como resultado un ahorro de memoria de diez a cientos de megabytes por proceso de JVM.

Los servicios en la nube sin servidor cargan varios miles de clases de aplicaciones al inicio y AppCDS puede permitir que estos servicios se inicien rápidamente y mejorar el tiempo de respuesta general del sistema.En esta versión de Java 10, CDS no puede archivar clases de módulos definidos por el usuario, pero está planeado para apoye esto en versiones futuras.

Apretones de manos locales de hilo:

Un punto seguro de JVM suspende todos los subprocesos de Java. Es necesario suspender todos los subprocesos de Java para asegurarnos de que solo tenemos acceso a las estructuras de datos en jvm para trabajar de forma segura con ellos. Los puntos seguros se pueden utilizar para la recolección de basura, la desoptimización de código y más.

La función de protocolo de enlace local de subprocesos está esencialmente tratando de reducir el número de puntos seguros globales. La forma en que lo hacen es mediante la introducción de una forma de ejecutar una devolución de llamada en subprocesos sin realizar un punto seguro global de VM. Esto hace que sea posible y económico detener subprocesos individuales y no solo subprocesos a la vez, sentando las bases para un mejor rendimiento de la máquina virtual.

Ahora, ¿dónde entran los apretones de manos? El apretón de manos es la devolución de llamada que se ejecuta para cada hilo de Java mientras ese hilo está en un estado seguro para puntos seguros. La devolución de llamada es ejecutada por el subproceso mismo o por el subproceso de VM, mientras se mantiene el subproceso en un estado bloqueado. El subproceso de VM coordinará la operación de reconocimiento a través de una operación de VM que, en efecto, evitará que ocurra un punto seguro global durante la operación de reconocimiento.

Versiones de versiones basadas en tiempo:

Un ciclo de lanzamiento de seis meses es lo que se puede esperar con un lanzamiento de soporte a largo plazo cada tres años. ¿Cómo se representan estas versiones? Los componentes principales son $ FEATURE, $ INTERIM, $ UPDATE y $ PATCH. El contador de lanzamiento de funciones se incrementa para cada lanzamiento de funciones, independientemente del contenido.

Se pueden agregar funciones en una versión de funciones o se pueden eliminar. Si se quita, se notifica con anticipación al menos una liberación antes de tiempo. Esto solía llamarse $ MAJOR.

El contador de versiones provisionales se incrementa para versiones sin funciones que contienen mejoras y correcciones de errores compatibles, pero sin eliminación de funciones ni cambios en las API estándar. Esto solía llamarse $ MINOR.

El contador de versiones de actualizaciones se incrementa para las versiones de actualizaciones compatibles que solucionan problemas de seguridad, regresiones y errores en nuevas funciones. Esto solía llamarse $ SECURITY. El contador de liberación de parches de emergencia se incrementa solo cuando es necesario producir una liberación de emergencia para solucionar un problema crítico.

Compilador JIT basado en Java:

Esta característica permite que el compilador experimental Just-In-Time basado en Java, Graal, se utilice en la plataforma Linux. El hotspot Jvm tiene dos compiladores de tiempo de ejecución llamados C1 y C2.

C1 es un compilador relativamente rápido y simple que no hace mucha optimización y es bueno para aplicaciones que requieren un inicio rápido.

C2 hace más optimización y es mejor para aplicaciones de servidor de larga ejecución. Ambos son compiladores just-in-time.

Otro compilador just-in-time para java se llama Graal. Está escrito en Java para compilar código de bytes de Java. Graal se agregó nuevamente en Java 9, pero con esta función puede habilitarlo con argumentos específicos de JVM (-XX: + UnlockExperimentalVMOptions -XX: + useJVMCICompiler). Habilitar el compilador experimental ayudará a los equipos de Graal y HotSpot a investigar la viabilidad de un compilador JIT basado en Java para el JDK.

NUEVO en Java 11:

Nueva sintaxis para parámetros Lambda:

Si recuerda, en Java 10, obtuvimos el nuevo identificador “var” para las variables locales, pero no pudimos usarlo en expresiones lambda. Ahora, en Java 11, también podemos usar var para expresiones lambda. ¿Cómo funciona esto? Bueno, en Java 11, obtenemos una nueva característica que nos permite escribir de la siguiente manera:

(var n, var m) -> n * m;

La sintaxis antigua era (n, m) -> n * m;
Mirando lo anterior, no parece muy útil. ¿Por qué querríamos agregar la verborrea extra aquí? Aunque Java 8 nos permite eliminar la información de tipo para que var no siempre sea necesario. Esta característica nos da uniformidad con las variables locales, lo que es más importante, nos permite agregar anotaciones a los parámetros, como @Nonnull y @Nullable. Por ejemplo:

(@Nonnull var n, @Nullable var m) -> n * m


Estandarización del cliente HTTP:

El cliente HTTP se introdujo en Java 9, se actualizó en Java 10 y con esta característica, finalmente se estandarizó. Esto significa que :

La API incubada se ha eliminado y ahora tendrá acceso a la API estándar con java.net.http. La API de incubación recibió muchas rondas de comentarios que resultaron en mejoras significativas, pero la API en un nivel alto sigue siendo en gran medida la misma.

Sin embargo, su implementación casi ha sido reescrita. Ahora es asincrónico, mientras que la implementación anterior estaba bloqueando y el concepto de flujo Rx o Reactive x se ha llevado a la implementación, eliminando muchos de los conceptos personalizados originales necesarios para admitir HTTP2. Además, el flujo de datos ahora se puede rastrear más fácilmente desde la solicitud de nivel de usuario hasta la conexión de socket subyacente.

Esta característica reduce significativamente la complejidad del código y maximiza la posibilidad de reutilización entre HTTP 1.1 y HTTP 2.

Recolectores de basura:

En Java 11, también tenemos algunos recolectores de basura nuevos. Primero, obtenemos Epsilon, que es un recolector de basura de baja sobrecarga que maneja la asignación de memoria sin implementar ningún mecanismo para recuperar memoria. Esto puede parecer extraño porque es un recolector de basura que no quiere hacer ninguna recolección de basura. Sin reclamar memoria, eventualmente alcanzará los límites del montón de Java y se cerrará la JVM. Por qué querrías esto? Si quisiera crear su propio recolector de basura, le proporcionaría una buena implementación de referencia para comenzar. También tiene algunas ventajas para las pruebas de rendimiento y presión de memoria.

Otro recolector de basura que obtenemos es el recolector de basura Z escalable de baja latencia y reducirá la duración de las pausas y manejará varios tamaños de montón. También sentará las bases de las ofertas de programación de Java para futuras funciones y optimizaciones del recolector de basura, ya que aprovecha los indicadores y las barreras de carga. El recolector de basura Z solo funcionará en Linux por ahora.

Inicie programas de código fuente de un solo archivo:

En Java 11, también podremos lanzar programas de código fuente de un solo archivo. Esto nos permite ejecutar nuestro código fuente de Java directamente usando el intérprete de Java.

En Java 10, el lanzador de Java operaba en 3 modos, es decir, lanzar un archivo de clase, lanzar la clase principal de un archivo jar y lanzar la clase principal de un módulo. Java 11 agrega un cuarto modo, es decir, lanzar una clase declarada en un archivo fuente. ¿Como funciona esto?

El código fuente se compila en la memoria y luego el intérprete lo ejecuta. Supongamos, por ejemplo, que tenemos una clase “Hello.java” (esta clase contiene solo un método principal).

public class HelloJava {

public static void main (String [] args) {

System.out.println (String.format (“Hola% s”, args [0]));

}
Ahora, para ejecutar este archivo java, tenemos que ejecutar el comando “java Hello.java demoJava” Esto nos dará la salida como “Hello demoJava”. demoJava, pasé de la línea de comando y se imprimió como salida.

Entonces, lo anterior solo podemos lograr en java 11. ¿Pero cuál es la limitación aquí? Su programa debe ser un programa de un solo archivo donde todo el código quepa en un solo archivo fuente. Esto significa que todas sus clases deben definirse en el mismo archivo. Esta característica junto con JShell es realmente excelente para crear programas simples.

Grabador de vuelo de Java:

En lugar de utilizar herramientas de terceros, Java 11 proporciona una forma de ayudar a solucionar problemas de programas Java con API para producir y consumir datos como eventos. Si bien el seguimiento de JVM basado en eventos existe desde hace un tiempo, ahora los eventos se pueden crear, configurar y filtrar en Java.

Los registradores de vuelo registran eventos que se originan en aplicaciones, JVM y OS. Los eventos se almacenan en un solo archivo y se pueden inspeccionar usando Java Mission Control.

Algunos de los argumentos de JVM para habilitar el registrador de vuelo de Java.

java -XX: StartFlightRecording = settings = default // Continuo con volcado bajo demanda

Si queremos obtener un volcado continuo de eventos bajo demanda, podemos escribir Java StartFlightRecording. Si queremos obtener un volcado de eventos continuos al salir, deberíamos agregar los siguientes argumentos:

java -XX: StartFlightRecording = settings = default -XX: FlightRecorderOptions = dumponexit = true, dumponexitpath = C: dump


Aquí incluimos una ruta donde queremos almacenar el archivo final.

Actualizaciones de seguridad:

En Java 11, también obtenemos algunas actualizaciones de seguridad. Primero, se ha cambiado la implementación del acuerdo clave. Obtenemos la versión 1.3 de TLS con Java 11. Esta es una revisión importante del protocolo TLS y mejora la seguridad y el rendimiento. Java 11 también incluye la implementación del algoritmo criptográfico ChaCha20 y ChaCha20-Poly1305.

Mejoras de JVM:

En Java 11, tenemos constantes de archivos de clases dinámicas. Esta característica amplía los formatos de archivo de la clase Java para admitir un nuevo formulario de grupo constante que incluye uno para implementadores de compiladores y diseñadores de lenguajes. A continuación, tenemos un control de acceso basado en nidos en java 11. Esto significa que si anida varias clases, pueden acceder a los datos privados de las demás. Con esto, ya no necesitamos depender de puentes de acceso para que esto funcione.

Actualizaciones de API de archivos:

Java 11 hace que sea muy fácil leer y escribir cadenas desde y hacia un archivo.

El archivo tiene el método “WriteString ()” que toma una ruta como entrada que es la ruta del archivo y su secuencia de caracteres, es decir, nada más que una cadena de caracteres que quieren escribir en un archivo. Este método devuelve una ruta de archivo donde se crea el archivo. Por ejemplo:

Ruta de acceso = Files.writeString (Files.createTempFile (“testFile”, “.txt”), “Características de Java 11”);


Así que aquí este método “writeString ()” devuelve una ruta en la que se crea el archivo en el que se escribirá el contenido en una sola línea.

Ahora, para leer el contenido de ese archivo, java 11 proporciona otro método llamado “readString ()” que lee el contenido de un archivo y devuelve la cadena.

Ej: String str = Files.readString (ruta);

Otras actualizaciones en Java 11:

Actualizaciones de la API de cadenas

Método IsBlank (): se ha agregado a la clase String. Si una cadena de Java tiene cualquier número de espacios en blanco, este método devolverá verdadero. Incluso si la Cadena contiene un solo espacio en blanco (espacio en blanco) también (Cadena str = ””); entonces el método isBlank () devolverá verdadero. Si la cadena tiene al menos un carácter con cualquier número de espacios en blanco (espacios en blanco), el método devolverá falso

El método Lines () en Java 11 devuelve un flujo de cadenas al dividir la cadena usando el carácter de nueva línea cuando la cadena tiene un carácter de nueva línea dentro de ella

Método IsEmpty () en la clase opcional

Java 11 también proporciona el método isEmpty () en la clase opcional, es decir, útil cuando se trabaja con la programación reactiva con Spring. Donde cuando devuelve un tipo Opcional, entonces podemos verificar si está vacío usando el método isEmpty ().

Ejemplo: <String> opcional str = Optional.empty ();

Deprecations:

Java 11 ha eliminado ciertos paquetes como Nashron Java Script Engine, herramientas Pack200, java.xml.ws, java.activation, java.transaction, java.xml.bind y java.corba. Todos estos paquetes y clases formaban parte del JDK anteriormente. Todos estos fueron obsoletos en la versión anterior de Java bit en JAVA 11 y se eliminaron por completo.

Entonces, si está usando alguno de estos, su código no se compilará. Pero si tiene un proyecto de maven, puede tomar estas dependencias del repositorio de maven y aún puede usarlas. Pero estos ya no forman parte de JDK en Java 11.

Conclusión:

En este artículo, habría obtenido un conocimiento conceptual y teórico claro sobre las nuevas características de Java 10 y Java 11, incluida la importancia de las características en términos de aspectos de programación.

Leave a Reply

Your email address will not be published. Required fields are marked *