黑马程序员技术交流社区

标题: 【上海校区】JVM类加载过程与双亲委派模型 [打印本页]

作者: 梦缠绕的时候    时间: 2019-10-16 09:55
标题: 【上海校区】JVM类加载过程与双亲委派模型

[backcolor=rgba(255, 255, 255, 0.9)]类加载过程为JVM将类描述数据从.class文件中加载到内存,并对数据进行解析和初始化,最终形成被JVM直接使用的Java类型。包含:

[backcolor=rgba(255, 255, 255, 0.9)]2|0类加载器

[backcolor=rgba(255, 255, 255, 0.9)]类加载过程中的加载操作由类加载去完成。类加载器分为:

[backcolor=rgba(255, 255, 255, 0.9)]3|0双亲委派模型

[backcolor=rgba(255, 255, 255, 0.9)]

[backcolor=rgba(255, 255, 255, 0.9)]双亲委派过程:当一个类加载器收到类加载任务时,立即将任务委派给它的父类加载器去执行,直至委派给最顶层的启动类加载器为止。如果父类加载器无法加载委派给它的类时,将类加载任务退回给它的下一级加载器去执行。

[backcolor=rgba(255, 255, 255, 0.9)]双亲委派模型最大的好处就是让Java类同其类加载器一起具备了一种带优先级的层次关系。举个例子来说明下:比如我们要加载顶层的Java类——java.lang.Object类,无论我们用哪个类加载器去加载Object类,这个加载请求最终都会委托给启动类加载器(Bootstrap ClassLoader),这样就保证了所有加载器加载的Object类都是同一个类。如果没有双亲委派模型,就会出现 Wupx::Object 和 Huyx::Object 这样两个不同的Object类。

[backcolor=rgba(255, 255, 255, 0.9)]4|0双亲委派模型案例

[backcolor=rgba(255, 255, 255, 0.9)]java.lang.ClassLoader 的 loadClass() 方法

protected Class<?> loadClass(String name, boolean resolve)        throws ClassNotFoundException    {        synchronized (getClassLoadingLock(name)) {            // First, check if the class has already been loaded            Class<?> c = findLoadedClass(name);            if (c == null) {                long t0 = System.nanoTime();                try {                    if (parent != null) {                        c = parent.loadClass(name, false);                    } else {                        c = findBootstrapClassOrNull(name);                    }                } catch (ClassNotFoundException e) {                    // ClassNotFoundException thrown if class not found                    // from the non-null parent class loader                }                if (c == null) {                    // If still not found, then invoke findClass in order                    // to find the class.                    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;        }    }



作者: 梦缠绕的时候    时间: 2019-10-16 09:55
有任何问题欢迎在评论区留言
作者: 梦缠绕的时候    时间: 2019-10-16 09:55
或者添加学姐微信
DKA-2018




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2