Carga e inicio de JVM (mecanismo de delegación parental)

Exploración 1: Cómo "nuevo" un objeto

Ejemplo: crear una instancia de coche a través de nuevo

ClassLoader carga el archivo de clase en la máquina virtual JVM y el archivo de clase de coche se inicializa al mismo tiempo,

Este archivo es una plantilla de la instancia de Car y todas las instancias se crean en función de esta plantilla.

Entonces, cuando usamos la palabra clave "nuevo" para crear un objeto, en realidad obtenemos una copia de la "Clase de automóvil".

 

Exploración 2: mecanismo de delegación de los padres

Cuatro cargadores

Ver el código fuente de la idea para comprender el proceso de ejecución.

ctrl + N , busque ClassLoader y luego seleccione la clase en java.lang

Después de ingresar a la clase, ctrl + F , busque loadClass

protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // 首先检查这个classsh是否已经加载过了
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    // c==null表示没有加载,如果有父类的加载器则让父类加载器加载
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        //如果父类的加载器为空 则说明递归到bootStrapClassloader了
                        //bootStrapClassloader比较特殊无法通过get获取
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {}
                if (c == null) {
                    //如果bootstrapClassLoader 仍然没有加载过,则递归回来,尝试自己去加载class
                    long t1 = System.nanoTime();
                    c = findClass(name);
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

Proceso de carga de clases

La figura está arriba y abajo, a la izquierda y luego se ejecuta.


Mecanismo de delegación de los padres

1. Evite la carga repetida del mismo .class. Pregunte lo anterior confiando. Una vez cargado, no es necesario volver a cargarlo. Garantice la seguridad de los datos.
2. Asegúrese de que .classno se pueda manipular el núcleo . A través del método de delegación, no se manipulará el núcleo .clas, aunque se manipule, no se cargará, e incluso si se carga, no será el mismo .classobjeto. Diferentes cargadores cargan el mismo objeto y .classno el mismo Classobjeto. Esto garantiza la Classseguridad de la ejecución.

El aislamiento de la zona de pruebas es el objetivo y la delegación de los padres es la realización.

No es difícil ver en esta imagen que las clases en paquetes como java, javax y sun (como java.lang.Object, java.lang.String, etc.) son todas cargadas por el cargador de clases de inicio, por lo que are Estas clases no necesitan ser empaquetadas, y si creamos clases con el mismo nombre bajo la misma ruta, no se pueden cargar.

 

 

 

 

+++++++++++++++++++++++++++++++++++
+ Si tiene alguna pregunta, por favor + Q: 1602701980 discutan juntos +
++++ +++++++++++++++++++++++++++++++

Supongo que te gusta

Origin blog.csdn.net/shenyuye/article/details/108063087
Recomendado
Clasificación