JVM - la carga de clases relacionadas

0 Introducción

A continuación se basan en la máquina virtual de HotSpot

 

1, la estructura general de JVM

Descripción general:

        

 

 

mapa detallado:

 

 

área de datos en tiempo de ejecución se explica en detalle:

 

 

Después de JDK8 convertido en el método división área de metadatos, de hecho, los metadatos puede producto + compilador JIT llamada Zona no montón

 

 

 

 

 

 

 

 

2, el procedimiento de carga de clases

Las clases comienzan a ser cargado en la memoria de la máquina virtual, hasta descargar una memoria, la totalidad de su ciclo de vida, incluyendo: carga, validación, preparación, análisis sintáctico, la inicialización, uso y desinstalación de siete etapas. Su orden como se muestra a continuación:

Lo que hizo específicamente cada paso => Enlaces de referencia

¿Qué nota

1) enlace (link) en preparación (preparar) tendrá como escenario una variable de clase (con estática modificado) Asignar valores predeterminados, tales como el valor predeterminado es 0 int

2) Carga (carga) sólo es responsable de cargar la clase de información binaria que entra, no se hace responsable por los demás.

sincronización 3) clases de inicialización tienen condiciones de disparo, utilice el siguiente caso iniciativa

 

 

 

 

 Encuadernación 2) y 3) por lo que hay una diferencia entre el Class.forName y ClassLoader.load, referencia enlace

 

 

 

 

 

 3 cargador de clases, procedimiento de carga de clases

 

 

 

 1) Clase cargador de arranque

 

2) cargador de clases de Extensión

 

 

 3) cargador de clases de aplicaciones

 

 

 

 Por cierto:

¿Cómo la JVM determina si los dos objetos son de la misma clase se requieren condiciones de Clase Dos

1) el nombre completo de la clase de la clase debe coincidir exactamente, incluyendo el nombre del paquete

2) cargador de clases de clases de carga también debe ser el mismo!

En otras palabras, incluso con un archivo de clase de información de clase, sólo tiene que utilizar el cargador no es lo mismo, que la JVM no puede ser tratada como la misma clase

 

 

 

 

 

4, en la clase ClassLoader

 

 

 

 

NOTA: la apertura de la fuente puede ser visto sun.misc.Launcher AppClassLoader ExtClassLoader y su clase interna, se carga por el Launcher BootstrapClassLoader. Para obtener más información, consulte este enlace

在代码中可以有三种方式来获取 ClassLoader 类。详情参考此链接

 

 

 

 

 

 

 

 5、双亲委派机制

 

 

 

好处 :这个机制保护了基础类不被蓄意 "破坏",例如类java.lang.Object,它存在在rt.jar,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的Bootstrap ClassLoader进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。相反,如果没有双亲委派模型而是由各个类加载器自行加载的话,如果用户编写了一个java.lang.Object的同名类并放在ClassPath中,那系统中将会出现多个不同的Object类,程序将混乱。因此,如果开发者尝试编写一个与rt.jar类库中重名的Java类可以正常编译,但是永远无法被加载运行。

特殊情况:有时候父加载器需要子加载器对某些类进行加载,需要破坏原本的 "向上" 传递的规则 ,于是就有了 Thread.currentThread().getContextClassLoader() 具体参考此链接

 

Supongo que te gusta

Origin www.cnblogs.com/qwertiLH/p/12505440.html
Recomendado
Clasificación