标签:ted record load row bee sys cte get 为什么
title: 双亲委派模型
date: 2018-10-24 15:05:54
tags:
categories:
---
本来应该是jvm类加载机制的内容,但这个太重要了,我就单独写了一篇。jvm虚拟机有一个重要的判断(之一)两个类是否相等的依据,就是是否是同一个类加载器加载的类,首先要保证同一个类加载器加载,那么命名空间相等才有意义。
从java虚拟机的角度来说,有两种类加载器,一种是启动类加载器,另外就是其他类加载器。前者是由C++实现的,属于java虚拟机的一部分,后者使用Java语言实现的,并且继承自java.lang.ClassLoader。
从java开发者来说则可以细分成三类:
双亲委派模型就是按照顺序,以此使用这三种类加载器加载类,加载顺序如图所示。
ClassLoader中双亲委派模型源码实现:
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;
}
}
我们在这里简单分析一下远吗,首先我们要判断这个类是否加载过,如果没有加载,则对这个类进行加载。
加载是先调用父类加载器去加载(不断调用,不知道这里算不算递归??),如果父类加载器不存在,则被认为是Bootstrap加载器,这时候就直接使用这个类加载器进行加载,如果加载失败,就抛出异常。
介绍完了双亲委派模型,我们要知道为什么要使用这种方式去加载类。
标签:ted record load row bee sys cte get 为什么
原文地址:https://www.cnblogs.com/didadida/p/10144606.html