thomas programación programacion orientada objetos libro introducción fundamentos desde con codigos cero algoritmos java classloader

java - programación - manual de programacion android pdf



Flujo de carga de clases para un programa simple. (5)

El proceso de carga se puede ver como una interacción entre el subsistema Classloader y el área de memoria de JVM.

El cargador de clases funciona en tres pasos generales 1.) Cargando 2.) Vinculando y 3.) Inicialización.

La interacción muy básica entre el subsistema Classloader y el área de memoria ocurre durante el enlace (¡aparte de otras interacciones!)

La actividad de vinculación se subdivide en i.) Verificar ii.) Preparar y iii.) Resolver. Verificar: es más por seguridad, se comprueba la compilación válida. En el paso ii.) Preparar: la memoria variable estática se asigna y se asigna con los valores predeterminados. Y en

iii.) Resolver: Las referencias simbólicas se reemplazan con referencias originales del "Área de método" que contiene datos de nivel de clase y variables estáticas.

JVM Arch

Ahora mismo estoy empezando a aprender la arquitectura interna de Java. En términos generales, he entendido el concepto de carga de clases que carga las clases requeridas cuando se ejecuta jvm , se ClassNotFoundException jvm ClassNotFoundException cuando no se encuentra una clase y un cargador de clases específico carga las clases a las que hace referencia la clase.

Alguien puede explicar claramente el flujo de carga de clases, es decir, la secuencia de carga de clases bootstrap y la carga de clases definidas por el usuario en el código Java de muestra a continuación.

import java.io.File; public class Sample { public static void main(String[] args) { String fileName = "sample"; File file = new File(fileName); file.isFile(); } }

También aprendí de un material de referencia que "el classloader mantiene los espacios de nombres de las clases que carga". Por espacios de nombres, ¿significa eso los nombres literales de la clase? ¿Alguien también puede explicar la implicación / ventaja de eso?


Jerarquía del cargador de clases

Cada vez que se inicia una nueva JVM, el cargador de clases bootstrap es responsable de cargar las clases Java clave (desde el paquete java.lang ) y otras clases de tiempo de ejecución en la memoria primero. El cargador de clases de arranque es un padre de todos los demás cargadores de clases. En consecuencia, es el único sin un padre.

Luego viene el cargador de clases de extensión. Tiene el cargador de clases bootstrap como principal y es responsable de cargar las clases de todos los archivos .jar guardados en la ruta java.ext.dirs ; están disponibles independientemente de la ruta de java.ext.dirs de la JVM.

El tercer y más importante cargador de clases desde la perspectiva de un desarrollador es el sistema classloader classpath, que es un elemento secundario inmediato del cargador de clases de extensión. Carga clases de directorios y archivos jar especificados por la variable de entorno CLASSPATH , propiedad del sistema -classpath o opción de línea de comandos -classpath .

Espacio de nombres de ClassLoader

En Java, una clase se identifica de forma única mediante ClassLoader + Class ya que dos cargadores de clases diferentes pueden cargar la misma clase.

Class A loaded by ClassLoader A != Class A loaded by ClassLoader B

¿Cómo es útil?

Es útil para definir diferentes políticas de protección y acceso para diferentes cargadores de clases. Tome un ejemplo del applet que se carga con un cargador de clases diferente, no querría que una aplicación de terceros acceda a sus recursos. Así que para la seguridad es importante mantener diferentes espacios de nombres.


JVM mantiene un grupo de tiempo de ejecución en el área de permgen donde se cargan las clases. Cuando se hace referencia a una clase, el cargador de clases predeterminado encuentra la clase en la ruta de clases y la carga en este grupo. Y esto no es específico de las clases definidas por el usuario o las clases proporcionadas en JDK. Cuando se hace referencia a una clase, se carga en la memoria.

Las clases cargadas por el ClassLoader se almacenan internamente en la instancia de ClassLoader

// The classes loaded by this class loader. The only purpose of this table // is to keep the classes from being GC''ed until the loader is GC''ed. private final Vector<Class<?>> classes = new Vector<>();

Cuando se necesita agregar una clase a la memoria, se llama a la siguiente función:

// Invoked by the VM to record every loaded class with this loader. void addClass(Class c) { classes.addElement(c); }

Encontré un diagrama útil sobre cómo funcionan los cargadores de clases.


La máquina virtual de Java se inicia creando una clase inicial, que se especifica de una manera dependiente de la implementación, utilizando el cargador de clases de §5.3.1 ( §5.3.1 ). La Máquina Virtual de Java luego vincula la clase inicial, la inicializa y las variables de instancia estáticas declaradas en ella y finalmente invoca el método de clase pública void main (String []) . La invocación de este método impulsa todas las ejecuciones posteriores. La ejecución de las instrucciones de la máquina virtual de Java que constituyen el método principal puede provocar la vinculación (y, en consecuencia, la creación) de clases e interfaces adicionales, así como la invocación de métodos adicionales.

lee this enlace


Usted ejecutará su clase de Sample la siguiente manera

> java Sample

Para un poco de magia, consulte la salida de la opción -verbose:class y verá toneladas de las siguientes líneas ...

[Opened C:/jdk1.6.0_14/jre/lib/rt.jar] [Loaded java.lang.Object from C:/jdk1.6.0_14/jre/lib/rt.jar] [Loaded java.io.Serializable from C:/jdk1.6.0_14/jre/lib/rt.jar] [Loaded java.lang.Comparable from C:/jdk1.6.0_14/jre/lib/rt.jar] . . . . . . [Loaded java.security.cert.Certificate from C:/jdk1.6.0_14/jre/lib/rt.jar] [Loaded Sample from file:/D:/tmp/] [Loaded java.lang.Shutdown from C:/jdk1.6.0_14/jre/lib/rt.jar] [Loaded java.lang.Shutdown$Lock from C:/jdk1.6.0_14/jre/lib/rt.jar]

Verá un montón de clases de /jre/lib/rt.jar cargadas, mucho antes de que su clase sea cargada por el cargador de clases Bootstrap (o Primordial). Estos son los requisitos previos para ejecutar cualquier programa Java cargado por Bootstrap.

Otro conjunto de tarros es cargado por el cargador de clases de Extension . En este ejemplo particular, no hubo necesidad de ninguna clase desde lib /jre/lib/ext por lo tanto, no está cargado. Pero al cargador de clases de extensión se le asigna específicamente la tarea de cargar las clases desde la extensión lib.

EDITAR: aparte de la plataforma estándar, las clases de Java / Sun también proporcionan un conjunto de archivos jar que se utilizan para extender la API central de la plataforma . Los archivos jar colocados en la carpeta de extensión lib se colocan automáticamente en classpath y, por lo tanto, no es necesario incluirlos explícitamente en classpath. Aquí está el buen artículo oficial sobre el mismo tema.

Finalmente, su clase de Sample es cargada por el cargador de clases de Application después de que Bootstrap y Extension hayan terminado de cargarse.