Intercambio de datos de clase en Java – Part 1

Aquí discutiremos una de las características introducidas como una dolencia en Java10. Aquí discutiremos una de las funciones denominada intercambio de datos de clase, conocida popularmente como CDS , que puede ayudar a reducir el tiempo de inicio y las huellas de memoria para las aplicaciones Java.

Nota: ayuda a reducir el tiempo de inicio y las huellas de memoria entre máquinas virtuales Java (JVM) 

Cuando utiliza el instalador para instalar Oracle Java Runtime Environment (JRE), el instalador carga un conjunto predeterminado de clases del archivo Java Archive (JAR) del sistema en una representación interna privada y vuelca esa representación en un archivo denominado archivo compartido. Si no se utiliza el instalador de JRE, puede generar el archivo compartido manualmente. Cuando se inicia la JVM, el archivo compartido se asigna a la memoria para permitir el intercambio de metadatos de JVM de solo lectura para estas clases entre varios procesos de JVM. Debido a que acceder al archivo compartido es más rápido que cargar las clases, se reduce el tiempo de inicio.

Los datos de clase son compatibles con los recolectores de elementos no utilizados G1, serie, paralelo y paraleloOldGC . La función de string compartida (parte del uso compartido de datos de clase) solo admite el recolector de elementos no utilizados G1 en plataformas de 64 bits que no son de Windows. La principal motivación para incluir CDS en Java SE es reducir el tiempo de inicio. Cuanto más pequeña sea la aplicación en relación con la cantidad de clases principales que utiliza, mayor será la fracción ahorrada del tiempo de inicio.

Si JRE está instalado usando el instalador y va a la ruta jre/bin/[servidor o cliente], verá un archivo classes.jsa

¿Por qué es importante el archivo de archivo compartido (classes.jsa)?

Este archivo es importante porque contiene un volcado de la forma convertida de muchas clases del sistema. Dado que estas clases de Java son algunas de las clases del sistema que se cargan cada vez que se inicia JVM y su contenido no cambia, a diferencia de su propio código de aplicación. El volcado de estas clases se toma una vez cuando instala JRE y se convierte en un formato fácil de cargar y se usa una y otra vez para mejorar el tiempo de inicio de JVM sin pasar por muchos pasos de la carga de clases habitual que ocurriría una y otra vez cada vez que se inicia JVM.

Creando un archivo de archivo compartido por nosotros mismos

Supongamos que el archivo classes.jsa no está presente, puede crearlo usted mismo usando el comando java -Xshare:dump . Este comando irá al archivo de lista de clases y verificará qué clases cargar y creará un volcado de ellas. Se puede intentar eliminar el archivo jre/bin/[cliente o servidor]/classes.jsa y volver a crearlo con el comando java_Xshare:dump. 

En la siguiente instantánea, el archivo classes.jsa se eliminó y, en la siguiente, lo recreamos usando java-Xshare:dump

Si eliminamos el archivo JRE/lib/classlist, este proceso dará un error ya que no sabrá qué clases cargar y volcar. En la instantánea a continuación, hemos cambiado el nombre del archivo de la lista de clases e intentamos realizar un volcado que genera un error.

¿Cómo verificar si las clases se cargan desde el archivo Share Archive o los archivos jar?

Ejecutaremos un programa simple para ver cómo se cargan las clases desde el archivo class.jsa y no desde sus respectivos archivos jar, los argumentos de la VM que proporcionaré a mi programa serán: – detallado – Xshare:on (-Xshare: on significa encender Intercambio de datos de clase). Creé el siguiente programa simple y lo ejecuté con los argumentos anteriores.

Puede ver muchas clases de sistema que se cargan desde el archivo de objeto compartido. También agregué Math.random() simple en el código para mostrar una clase java.lang.Math$RandomNumberGeneralHolder que no se carga desde el archivo de objeto compartido, ya que no forma parte del archivo compartido y se carga desde rt.jar.

Si usamos args -verbose – Xshare:off , lo que significa un cambio de uso compartido de datos de clase, el resultado obtenido es el siguiente:

¿Qué es el uso compartido de datos de clase de ‘aplicación’?

En el ejemplo anterior, vimos que algunas clases como Math$RandomNumberGeneratorHolder se cargaron desde la fuente real y nuestra propia clase independiente AppClassDataSharing.java también se cargó desde la fuente real. ¿Qué pasaría si también pudiéramos volcarlos en Archivo Compartido y usar ese Archivo Compartido en el futuro, lo que mejorará el tiempo de ejecución de nuestra aplicación? Esto es lo que significa el uso compartido de datos de clase de aplicación que también podemos usar CDS de clases de aplicación.

Procedimiento: 

Esto implica 3 pasos: 

  1. Registre todas las clases que cargue mientras usa su aplicación en el primer archivo.
  2. Cree un archivo de volcado compartido para estas clases.
  3. Use ese volcado compartido más tarde al iniciar la aplicación.

Paso 1: Grabar todas las clases 

La clase anterior denominada ‘ AppClassDataSharing.java ‘ en un jar ejecutable AppCDS.jar (ya que AppCDS no descarga clases planas). Entonces, para crear un último archivo, usaré el siguiente comando de la siguiente manera:

java -XX:+UnlockCommercialFeatures-XX:+UseAppCDS -XX:DumpLoadedClassList=LoadedClasses.1st -jar AppCDS.jar

El archivo se creó en el directorio personalizado, por lo que aquí no estamos interfiriendo con los archivos JRE.

Podemos ver en la instantánea anterior que un archivo recién creado LoadedClasses. Primero, y también podemos ver en la siguiente instantánea, también tiene una entrada de su propia clase ‘ AppClassDataSharing ‘.

Paso 2: crear un archivo de volcado compartido para las clases anteriores

Usando este primer archivo, crearemos un volcado en la misma ubicación y más abajo está el comando y los argumentos para crear un archivo de almacenamiento compartido personalizado:

java -XX:+UnlockCommercialFeatures -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=LoadedClasses.1st -XX:SharedArchiveFile=CustomSharedArchive.jsa -cp AppCDS.jar

Nota: Se ha creado el archivo CustomSharedArchive.jsa y, a continuación, lo usaremos al iniciar nuestra aplicación para cargar clases desde él.

Paso 3: use el volcado compartido al iniciar la aplicación.

Lanzaremos nuestra aplicación usando el siguiente comando y parámetros para usar el archivo CustomSharedArchive.jsa’

java -XX:UnlockCommercialFeatures -verbose -XShare:on -XX:+UseAppCDS -XX:SharedArchiveFile=CUstomSharedArchive.jsa -jar AppCDS.jar

Podemos ver que ambos archivos RandomNumberGeneratorHolder y AppClassDataSharing ahora se cargan desde un archivo de objeto compartido. Puede probar el comando anterior usando – Xshare:off para ver los resultados.

Podemos usar el comando de tiempo (simplemente anteponga el tiempo al comando) para ver la diferencia cuando usa _Xshare:on vs -Xshare:off. 

Entonces, con el uso compartido de datos de clase de aplicación, podemos reducir la huella y el tiempo de ejecución de nuestra aplicación.

Publicación traducida automáticamente

Artículo escrito por akashpandit1103 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *