mecanismo de carga Jvm y similares

JVM

mecanismo de carga de clases de Java

1. ¿Cuál es la clase cargada

Clase de carga se refiere a la clase .class archivo de datos binarios se lee en la memoria, el área de método en el que el área de datos de tiempo de ejecución, y a continuación, crear una pila en la región java.lang.Class objetos, con estructura de datos de clase encapsula en el área de método. producto final la carga de clases se encuentra en el montón Clase objeto que encapsula la estructura de datos en el área de método de clase, y proporciona un método de acceso de interfaz de la zona de estructura de datos del programador de Java.

cargador de clases no tiene que esperar hasta que una clase es la primera vez que utiliza activamente en la carga si, clase JVM cargador estandarizado operación cuando se espera una clase que se utilizará será pre-cargado en él, si se encuentra durante la pre-cargado en .class el archivo no existe o hay un error, el cargador de clases para informar de un error en el programa por primera vez tomar la iniciativa de utilizar la clase, si la clase no ha estado usando activamente el programa, el cargador de clases no informar de un error.

2. ciclo de vida de la clase

Cargando la clase incluye la carga, la verificación, la preparación, el análisis de inicialización de cinco etapas, en cinco etapas, la carga, la verificación, la preparación, la inicialización se determina la secuencia, la fase de resolución no es necesariamente, es en algunos casos próxima salida después de la fase de inicialización, que es vinculante para apoyar dinámico lenguaje java. También estas etapas es comenzando secuencialmente, en lugar de la secuencia completa, debido a que estas etapas se llevan a cabo a menudo la mezcla interdigitados, o activar otra por lo general se llama durante la fase de ejecución de una etapa.

carga
  • Para obtener definido por un nombre de clase completo de la clase de flujo de bytes binaria
  • La conversión de la estructura de bytes de almacenamiento de corriente representa la estructura de datos de tiempo de ejecución estática en la zona método
  • Generación de un Java representantes montón de esta clase java.lang.Class objetos, un método de acceso a una zona de entrada de datos

Los desarrolladores pueden utilizar ya sea el cargador de clases que proporciona el sistema de carga de meta, también puede definir su propio cargador de clases a la carga de meta.

verificación

El primer paso es verificar la fase de conexión, el objetivo es garantizar que el archivo de clase de flujo de bytes de información contiene cumple con los requisitos de la máquina virtual actual y la máquina virtual no pongan en peligro su propia seguridad.

  • validación de formato de archivo
  • validación de metadatos
  • la verificación de código de bytes
  • Verificación de referencias simbólicas
listo

Asignar memoria para las variables de clase y formales fase de ajuste de valor inicial variable de clase, y estos son área de memoria asignada en el proceso

  • Esta vez la asignación de memoria contiene variables de clase solamente ( estáticas ), y no incluye las variables de instancia, variables de instancia en el montón asignada como objetos Java cuando se crea una instancia de un objeto
  • Normalmente, el valor inicial establecido aquí es el tipo de datos del valor por defecto de cero, en lugar del valor aparece en el código Java se le asigna.
  • Si el campo de atributo de campo de mesa de la propiedad ConstantValue, que es, al mismo tiempo, sea definitiva y estática modificación, entonces la variable etapa de preparación valor se inicializa.
Resolver

Analizar etapa es una máquina virtual a una piscina constante de referencias simbólicas al proceso de reemplazar referencias directas. operación de análisis principalmente para clase o interfaz, campo, métodos de clase, el método de la interfaz, el tipo de método, mango método, y el punto de calificador llamada

Y así sucesivamente.

  • referencias Símbolo: una descripción del conjunto de objetivo de los símbolos, pueden ser cualquier literal
  • Referencia directa: puntero directo al objeto, una indirecta o desplazada con respecto al mango objetivo de posicionamiento
inicialización

Inicialización, dado el valor inicial correcto para la clase de variables estáticas, se inicializan las clases JVM responsable de la inicialización de las variables principales de clase.

  • valor inicial Declarar una variable de clase se especifica
  • Utilizando el bloque de código estático se le asigna un valor inicial para las variables de clase

etapa de inicialización JVM

  • Si la clase no se ha cargado, el programa se carga y se conecta a la clase
  • Si la clase padre directa no se ha inicializado, inicializa por primera vez su matriz directa
  • Si no hay declaración de clase de inicialización, el sistema con el fin de realizar la declaración de inicialización.
Conducir a la inicialización de clase
  • Crear una instancia de la clase, que es el nuevo método
  • variables estáticas de acceso de una clase o interfaz, o la asignación de las variables estáticas
  • la clase llamada a un método estático
  • 反射( Class.forName ( “com.qxy.test”) )
  • Subclase de iniciar una clase de clases, los padres no se inicializará
  • Se indica cuando la máquina virtual de Java se inicia clases comienzan las clases para ejecutar una clase maestra de comandos directamente java.exe
Fin de situaciones de la vida
  • Ejecutar método System.exit ()
  • la ejecución del programa normal
  • Encontrado una excepción o un error en el proceso de aplicación se termina
  • Debido a que el error del sistema operativo causó el proceso para terminar con la máquina virtual de Java
3. El cargador de clases
Varios cargador de clases
  • cargador de clases de arranque (Bootstrap cargador de clases) es responsable de la carga en JDK \ jre \ lib o sustituido parámetro -Xbootclasspath ruta especificada, y puede ser reconocido por la biblioteca de la máquina virtual. Inicio cargador de clases no puede ser programa Java referencia directamente
  • cargador de clases de extensión (extensión cargador de clases): El cargador se encarga de cargar JDK \ jre \ lib \ ext o java.ext.dirs todas las bibliotecas, los desarrolladores pueden especificar las variables del sistema directamente utilizando el cargador de clases de extensión
  • cargador de clases de aplicación (aplicación cargador de clases): responsable de cargar la ruta de clase de usuario especifica la clase, si su aplicación no viven su cargador de clase personalizada, en general, es que el programa en el cargador de clases por defecto.
mecanismo Jvm clase de carga
  • La responsabilidad general: cuando un cargador de clases es responsable de cargar una clase, su clase y otra clase también depende citados por el cargador de clases es responsable de la carga, a menos que de la utilización de otro cargador de clases a la carga
  • delegado de los padres: dejar que los intentos cargador de clases padre a cargar la clase, sólo cuando el cargador de clases padre no puede cargar la clase intentará cargar su propia clase de la ruta de clases
  • Almacenamiento en caché: mecanismo de almacenamiento en caché se asegurará de que toda la clase se cargarán a través de la caché, cuando el programa requiere el uso de una clase, el cargador de clases buscará el buffer de inicio de la clase, sólo el búfer no existe, el sistema leerá correspondiente a dichos datos binarios, y la convierte en objeto Class en el buffer.
4. Clase de carga

Hay tres maneras

  • Cuando la línea de comandos para iniciar la JVM carga de la aplicación de inicialización
  • Por Class.forName **) ** carga dinámica (
  • Por ClassLoader.loadClass () carga dinámica
Class.forName Diferencia () y ClassLoader.loadClass () de
  • Class.forName(): El archivo .class se carga en la clase más allá de la JVM, se explicará en base a los bloques ejecutados clase estática;
  • ClassLoader.loadClass(): Hacer solamente una cosa, es para cargar el archivo .class en la JVM no se realiza en el contenido estático, sólo la voluntad de llevar a cabo el bloque newInstance estática.
  • Class.forName(name,initialize,loader)Función de control también puede ser parametrizado si el bloque de carga estática. Y sólo llaman a los usos del método newInstance () llama al constructor, crean una clase de objeto.
5. Los padres mecanismo de delegado
  • 1, cuando AppClassLoaderel tiempo para cargar una clase, primero no posee para tratar de cargar esta clase, pero los delegados cargador de clases para el cargador de clases padre ExtClassLoaderen completarse.
  • 2, cuando ExtClassLoaderal cargar una clase, primero no posee para tratar de cargar esta clase, pero los delegados cargador de clases para BootStrapClassLoaderllegar a su finalización.
  • 3, si BootStrapClassLoaderdeja de cargar (por ejemplo, $JAVA_HOME/jre/libal no encontrar la clase), se utilizará ExtClassLoaderpara tratar de carga;
  • 4, si ExtClassLoadertambién no se carga, se utilizará AppClassLoaderpara la carga, si AppClassLoadertambién falla en cargar, informará de la anomalía ClassNotFoundException.
efecto
  • Múltiples copias del mismo código de bytes prevenir
  • programa Java para garantizar la operación segura y estable
6. cargador de clase personalizada

Reescribiendo la FindClass método ()

Reescribir la loadClass () va a destruir el mecanismo de los padres delegado

Publicado 18 artículos originales · ganado elogios 2 · Vistas 371

Supongo que te gusta

Origin blog.csdn.net/weixin_40907792/article/details/105193826
Recomendado
Clasificación