sql >> Base de Datos >  >> RDS >> Database

¿Qué es una imagen de tiempo de ejecución personalizada en Java 9?

Java 9 introdujo la idea de imágenes de tiempo de ejecución modulares con Project Jigsaw y resolvió oficialmente el problema de enviar el tiempo de ejecución de Java como artefactos monolíticos. Las imágenes monolíticas en tiempo de ejecución no solo requerían mucho uso de la memoria, sino que también reducían el rendimiento general de la aplicación que se ejecutaba en ellas. Ahora podemos empaquetar un subconjunto personalizado de JRE, en función de las necesidades individuales de las aplicaciones que se ejecutan en él y aumentar su eficiencia. Este artículo ofrece una mirada holística a esta función de imágenes de tiempo de ejecución personalizadas introducidas con Java 9.

Una visión general

El impacto de la idea de crear una imagen de tiempo de ejecución modular con Java 9 es enorme. Abre la puerta a una aplicación personalizada directamente desde la plataforma en la que se ejecuta. La plataforma Java ha incrementado su funcionalidad con cada nueva versión. No es una sorpresa que en algún momento el tiempo de ejecución sea un artefacto monolítico y cobre un alto precio en la memoria y el rendimiento. Debido a esto, los desarrolladores han estado solicitando durante mucho tiempo una salida a este problema. Además, la mayoría de los programas no utilizan la Plataforma Java en su totalidad. Si un programa se puede optimizar para el rendimiento y el uso de la memoria, ¿por qué no se puede personalizar también la plataforma en la que se ejecuta? Java 8 dio el paso inicial y trató de implementar algún aspecto con Perfiles compactos . Java 9 lo llevó adelante e implementó una forma de crear imágenes de tiempo de ejecución personalizadas sin restricciones que Perfiles compactos impuesto. Tomó un enfoque holístico en el empaquetado de imágenes en tiempo de ejecución. La plataforma en sí está modularizada para habilitar esta característica. El código de la aplicación empaquetado en módulos se puede enviar con imágenes de tiempo de ejecución personalizadas que solo contienen los módulos de la plataforma que utiliza la aplicación. Por lo tanto, un programa de aplicación puede ser un único artefacto integrado que incluye el JRE personalizado. Esto ciertamente aprovecha el rendimiento, otorgando un tiempo de inicio con menos huellas de memoria. Si la aplicación se ejecuta en la Nube, estos disminuyen considerablemente la sobrecarga de la red y el tiempo de descarga.

Perfil compacto

Aunque Java 9 superó el concepto de Perfil compacto introducido con Java 8, a menudo es útil comprender y apreciar el hito alcanzado. En cierto modo, Java 9 se alimentó de la idea y actualizó el concepto de un Perfil compacto de una manera más holística.

Un Perfil compacto define subconjuntos de la API de la plataforma Java SE que pueden reducir el tamaño estático del tiempo de ejecución de Java. Esta idea está básicamente dirigida a trabajar en dispositivos con recursos limitados que tienen capacidades de almacenamiento más pequeñas, como un dispositivo integrado. Hay básicamente tres perfiles, llamados compact1 , compacto2 y compacto3 . Cada perfil numerado más alto es un superconjunto de su perfil numerado más bajo. Esto significa que compacto1 es un subconjunto propio de compact2 , compacto2 es un subconjunto propio de compact3 y compacto3 , a su vez, es un subconjunto adecuado de la API Java 8 SE de pila completa.

Referencias:

  • Perfiles compactos, documentación de Java SE 8
  • Descripción general de los perfiles compactos de Java SE Embedded 8
  • Introducción a los perfiles compactos de Java 8

Presentamos a JIMAGE

JIMAGE es un formato de archivo especial introducido con Java 9 para almacenar imágenes de tiempo de ejecución personalizadas. Este formato de archivo está optimizado para el rendimiento y el almacenamiento. El formato de archivo básicamente actúa como un contenedor para recursos, clases y módulos de JDK, y los indexa para una búsqueda rápida y una carga de clase más rápida. A diferencia de otros formatos de archivo, como JAR y JMOD, los desarrolladores rara vez utilizan JIMAGE en lo que respecta a las funciones internas de JDK, excepto cuando se desea crear una imagen de tiempo de ejecución personalizada. La carga de clases es más rápida con JIMAGE que con JAR o JMOD, ya que está específicamente optimizado para eso. Además, JIMAGE solo se puede usar en tiempo de ejecución. JIMAGE todavía está en sus primeros años. Hay muy poca información disponible para desarrolladores; quizás se expongan más más adelante.

Creación de imágenes personalizadas

Java 9 proporciona el jlink herramienta para crear imágenes de tiempo de ejecución específicas de la plataforma. Las imágenes personalizadas contienen módulos específicos de la aplicación y los módulos necesarios de la plataforma. Dado que el tamaño de la imagen en tiempo de ejecución, también conocido como JRE, se reduce al mínimo, la imagen de la aplicación junto con el JRE también es mínima. Incluye el JRE como una sola unidad de entrega junto con el programa. El jlink la herramienta se encuentra en el /bin directorio del JDK9 directorio instalado. Hay varias opciones disponibles que están asociadas con esta herramienta que se pueden utilizar según el requisito. La descripción se puede obtener utilizando la –ayuda opción disponible con jlink dominio. Aquí, se extrae por conveniencia, o puede escribir jlink –help en la línea de comando para obtener la siguiente lista.

Uso:

jlink <options> --module-path <modulepath>
   --add-modules <module>[,<module>...]
Opción Descripción
–add-modules [,…] Módulos raíz para resolver
–bind-services Enlace en módulos de proveedores de servicios y sus dependencias

-c, –comprimir=<0|1|2>

–disable-plugin

–endian

Habilitar la compresión de recursos:

Nivel 0:Sin compresión

Nivel 1:Intercambio constante de cadenas

Nivel 2:código postal

Deshabilitar el complemento mencionado

Orden de bytes de jimage generado (predeterminado:nativo)

-h, –ayuda

–ignorar-información-de-firma

–launcher =[/]

–limit-módulos [,…]

–list-plug-ins

Imprime este mensaje de ayuda

Suprime un error fatal cuando los JAR modulares firmados están vinculados en la imagen. Los archivos relacionados con la firma de los JAR modulares firmados no se copian en la imagen de tiempo de ejecución.

Agregue un comando de inicio del nombre dado para el módulo y la clase principal si se especifica.

Limita el universo de módulos observables.

Muestra los complementos disponibles.

-p, –ruta-módulo

–sin-archivos-de-encabezado

–no-man-pages

–salida

–save-opts

Ruta del módulo

Excluir incluir archivos de encabezado

Excluir páginas man

Ubicación de la ruta de salida

Guarde las opciones de jlink en el archivo dado

-G, –strip-debug

–sugerir-proveedores [,…]

Eliminar información de depuración

Sugiera proveedores que implementen los tipos de servicio dados desde la ruta del módulo

-v, –detallado

–versión

@

Habilitar seguimiento detallado

Información de la versión

Leer opciones del archivo

Un ejemplo sencillo

Aquí, veremos un programa muy simple desde el principio hasta el final de cómo crear una imagen de tiempo de ejecución de una aplicación Java. Asumiremos que JDK9 está correctamente instalado y el PATH y JAVA_HOME variable de entorno se configuran adecuadamente. En mi caso, se instala y configura de la siguiente manera (en una plataforma Linux):

  • JDK9 directorio instalado /usr/lib/jvm/java-9-oracle
  • RUTA está establecido en /usr/lib/jvm/java-9-oracle/bin
  • JAVA_HOME está configurado en /usr/lib/jvm/java-9-oracle

Paso 1

Cree un directorio llamado /Home/SampleProject y un origen directorio dentro de él (por ejemplo, /Home/SampleProject/src ).

Paso 2

Cree un directorio llamado org.app.test dentro del src directorio (por ejemplo, /Home/SampleProject/src/org.app.test ).

Paso 3

Ahora, dentro de org.app.test directorio, cree un archivo llamado module-info.java . Y escriba los siguientes contenidos:

module org.app.test{
   requires javafx.controls;
   exports org.app.test;
}

Paso 4

Ahora, crea un directorio llamado org, app, test uno dentro de otro (por ejemplo, org.app.test/org/app/test ) y luego cree un archivo llamado MyApplication.java dentro de la prueba directorio y escriba el siguiente contenido:

package org.app.test;

import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.stage.Stage;

public class MyApplication extends Application{

   public static void main(String[] args) {
      Application.launch(args);
   }

   @Override
   public void start(Stage stage) throws Exception {

      Alert alert = new Alert(Alert.AlertType.INFORMATION);
      alert.setTitle("Congratulation!");
      alert.setHeaderText("You did it. The application is
         running.
      Press OK to close");
      alert.setContentText("You have successfully created a
         custom image");
      alert.showAndWait().ifPresent(rs -> {
         if (rs == ButtonType.OK) {
            System.out.println("Pressed OK.");
         }
      });
   }
}

Paso 5

Crear un /Home/SampleProject/mods directorio. Aquí, guardaremos el código compilado. Compile el código fuente de la siguiente manera. El directorio de trabajo actual es /Home/SampleProject .

javac -d mods --module-source-path src
src/org.app.test/module-info.java
src/org.app.test/org/app/test/MyApplication.java

Paso 6

Ahora, creemos el archivo JAR y almacenémoslo en lib directorio (como /Home/SampleProject/lib ) de la siguiente manera:

jar --create --file lib/org.app.test.jar
--main-class org.app.test.MyApplication
-C mods/org.app.test .

Paso 7

Para probar, ejecute la aplicación de la siguiente manera:

java --module-path lib -m org.app.test

Paso 8

Ahora, creemos el archivo JMOD y guárdelo en jmods directorio (por ejemplo, Home/SampleProject/jmods ):

jmod create --class-path lib/org.app.test.jar
   jmods/org.app.test.jmod

Paso 9

Finalmente, creemos la imagen personalizada usando el siguiente comando:

jlink --module-path /usr/lib/jvm/java-9-oracle/jmods/:jmods
--add-modules org.app.test
--launcher runapp=org.app.test
--output dist

Esto creará una carpeta llamada dist que contiene todo lo necesario para ejecutar la aplicación. El programa, con el nombre del lanzador dado como runapp , está contenido en dist/bin directorio. Haz doble clic para ejecutarlo.


Figura 1: El programa se está ejecutando

Eso es todo.

Conclusión

Consulte la documentación correspondiente para obtener una descripción detallada de cada una de las opciones de comando utilizadas en este artículo. Pruebe un programa simple y constrúyalo de principio a fin. Esto generaría la confianza necesaria para experimentar con un programa un poco más complicado, como usar más de un módulo y tratar con sus dependencias. JDK9 ha permitido a los desarrolladores preparar su equipaje de tiempo de ejecución para que se llene solo con los módulos necesarios. Esto es increíble y excelente, algo que la mayoría de nosotros esperábamos de Java desde hace mucho tiempo. Una aplicación de Java ahora puede hacer caso omiso del equipaje que tuvo que llevar por razones aparentemente insignificantes y convertirse en una distribución optimizada para la plataforma.