La comprensión en profundidad de JVM: cargador de clases

Un cargador de clases

La fase de carga de clases para obtener la descripción de tales datos binarios en nombre de clase completo por una clase de esta corriente en la acción exterior JVM implementadas para lograr esta acción módulos de código llamados "cargador de clases."

Para cualquier clase, tendrá que establecer la singularidad de su JVM cargado por el cargador de clases y la clase en sí juntos. En otras palabras, si se carga un tipo diferente de cargador de clases, entonces las dos clases en la JVM es diferente.

Tres tipos cargador

JVM construido tres ClassLoader importante, además de otros BootstrapClassLoader por el cargador de clases de Java e implementar todas heredado de java.lang.ClassLoader:

  1. BootstrapClassLoader (boot loader clase)  : a nivel de primera clase de carga, realizado por C ++, se encarga de cargar  %JAVA_HOME%/libel paquete frasco y la clase o directorio, o  -Xbootclasspathtodos los parámetros especificados en la ruta de clase.
  2. ExtensionClassLoader (extensión cargador de clases)  : principalmente responsable de cargar el directorio de  %JRE_HOME%/lib/ext paquete frasco y directorio de la clase o  java.ext.dirs paquete frasco bajo variables del sistema ruta especificada.
  3. AppClassLoader (cargador de clases de la aplicación)  : para nuestros usuarios cargador es responsable de cargar todos los paquetes y clases tarro actuales en el classpath de la aplicación.

Desde la perspectiva de los dos únicos cargador de clases JVM:

(1) ClassLoader boostrap: Es toda la parte derecha de JVM implementación en C ++.

(2) el otro es el otro tipo de cargadores de clases, implementado por el java, toda clase abstracta java.lang.ClassLoader integrado.

En segundo lugar, el modelo de delegación de los padres

ClassLoader

Cada clase tiene un cargador de clases que. Sistema ClassLoder en el trabajo cuando se utiliza el valor por defecto  modelo de delegación de los padres  . Que es cuando se carga la clase, el sistema determinará primero si la clase es cargada también. Se ha cargado la clase será devuelto directamente, o tratará de carga. Cuando se carga, la solicitud se delega en el primer cargador de clases padre  loadClass() proceso, por lo que en última instancia, todas las solicitudes deben ser transferidos a la parte superior del cargador de clases de arranque  BootstrapClassLoader en. Cuando el cargador de clases padre no puede manejar, sólo para ser manejado por ellos mismos. Cuando el cargador de clases padre es nulo, se utiliza un cargador de clases de arranque  BootstrapClassLoader como cargador de clases padre.

Nota: La relación padre-hijo entre el cargador de clases no es de manera hereda, pero en combinación (prioridad)

fuente

private final ClassLoader parent; 
protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // 首先,检查请求的类是否已经被加载过
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {//父加载器不为空,调用父加载器loadClass()方法处理
                        c = parent.loadClass(name, false);
                    } else {//父加载器为空,使用启动类加载器 BootstrapClassLoader 加载
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                   //抛出异常说明父类加载器无法完成加载请求
                }

                if (c == null) {
                    long t1 = System.nanoTime();
                    //自己尝试加载
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

Si no desea utilizar el modelo de delegación de los padres: la necesidad de que el cargador de clases personalizada, reescribir loadClass método (), necesidad de ser clase ClassLoader integrado.

Publicados 134 artículos originales · ganado elogios 91 · vistas 160 000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_44588495/article/details/104130913
Recomendado
Clasificación