Mecanismo de delegación de padres JVM

Prólogo

La carga de clases Java es dinámica, no carga todas las clases a la vez y luego se ejecuta, pero asegura que la clase básica (como la clase base) del programa se cargue completamente en la jvm. En cuanto a otras clases, debe Antes de cargar. Por supuesto, esto es para ahorrar sobrecarga de memoria.

La máquina virtual Java adopta el método de carga bajo demanda para archivos de clase, es decir, cuando la clase necesita ser utilizada, su archivo de clase se carga en la memoria para generar objetos de clase. Y al cargar un archivo de clase de una clase determinada, la máquina virtual de Java adopta el modo de delegación principal, es decir, la solicitud es manejada por la clase principal, que es un modo de delegación de tareas.
 
Hay dos tipos de carga de clases:
  • Carga implícita, cuando el programa encuentra un objeto generado por métodos nuevos y otros durante la operación, se llama implícitamente al cargador de clases para cargar la clase correspondiente en el jvm,
  • Carga explícita, a través de class.forname () y otros métodos, cargando explícitamente la clase requerida
 
¿Por qué haces esto?
Si no utiliza el modelo de delegación principal y lo carga en cada cargador de clases, si el usuario escribe una clase llamada java.lang.Object y la coloca en el ClassPath del programa, el sistema tendrá varios Objetos diferentes. Clases, el comportamiento más básico en el sistema de tipos Java no se puede garantizar. La aplicación también se convertirá en un desastre.
 
El significado del mecanismo de delegación
Evite que aparezcan múltiples copias del mismo bytecode en la memoria
Por ejemplo, tanto la clase A como la clase B deben cargar la clase del sistema:
Si carga el suyo propio sin la puesta en marcha, la clase A cargará una copia del código de bytes del sistema, y ​​luego la clase B cargará una copia del código de bytes del sistema, de modo que dos copias del código de bytes del sistema aparecerán en la memoria.
Si usa el mecanismo de delegación, buscará recursivamente la clase principal, es decir, usará Bootstrap para intentar cargar, y si no puede encontrarla, baje. El Sistema aquí se puede encontrar en Bootstrap y luego se carga. Si la Clase B también necesita cargar el Sistema en este momento, también comienza desde Bootstrap. En este momento, Bootstrap descubre que el Sistema se ha cargado, luego devuelve directamente el Sistema en la memoria sin volver a cargarlo. , De modo que solo haya una copia del código de bytes del sistema en la memoria.
 
¿Puedes escribir una clase llamada java.lang.System tú mismo?
Respuesta: Por lo general, no, pero puede adoptar un enfoque alternativo para satisfacer esta demanda. 
Explicación: Para evitar que escribamos la clase del sistema, la carga de la clase utiliza un mecanismo de delegación, que puede garantizar que el cargador de clases principal tenga prioridad, y la clase que el cargador de clases principal puede encontrar, el cargador secundario no tiene posibilidad de cargar. El cargador de Bootstrap carga la clase del sistema. Incluso si se reescribe sola, siempre utiliza el sistema proporcionado por el sistema Java. La clase del sistema escrita por sí misma no tiene posibilidad de cargarse.
Sin embargo, podemos definir un cargador de clases para lograr este propósito. Para evitar el mecanismo de delegación principal, este cargador de clases también debe ser especial. Dado que el cargador de tres clases que viene con el sistema carga todas las clases en un directorio específico, si nuestro propio cargador de clases se coloca en un directorio especial, el cargador del sistema no se puede cargar, es decir, en última instancia es nuestra propia carga器 载。 Cargador.

 

Principio de funcionamiento
(1) Si un cargador de clases recibe una solicitud de carga de clases, no la carga primero, sino que delega la solicitud al cargador de clases padre para que se ejecute;
(2) Si el cargador de clases padre todavía tiene su cargador de clases padre, se delega aún más hacia arriba y recursivamente a su vez, y la solicitud eventualmente llegará al cargador de clases de inicio de nivel superior;
(3) Si el cargador de clases padre puede completar la tarea de carga de clases, regresa con éxito. Si el cargador de clases padre no puede completar la tarea de carga, el cargador hijo intenta cargarlo por sí mismo;
 
 

 

Supongo que te gusta

Origin www.cnblogs.com/caoxb/p/12735527.html
Recomendado
Clasificación