目录
1.什么是ClassLoader?
ClassLoader是类加载,把类的.class文件从磁盘加载进内存,放在运行时数据区的方法内,在堆中创建一个java.lang.class对象,方法区存放类相关的数据结构。
2.类加载器有哪几种以及加载对应的包有哪些?
类的加载器从上到下依次是Bootstrap ClassLoader,Ext ClassLoader,App ClassLoader,Customer ClassLoader
各个类加载对应的类加载目录如下:
Boostrap ClassLoader /JAVA_HOME/jre/lib目录下的jar包
Ext ClassLoader /JAV_HOME/jre/ext/lib目录下的jar包
App ClassLoader 加载CLASSPATH下所指定的类库,获得要加载的文件的路径 System.getProperty("java.class.path")
Customer ClassLoader 自定义类加载器需要继承ClassLoader,重写FindClass方法
3.类的生命过程是什么样的?
加载--->连接(验证,准备,解析)-->初始化-->使用--->卸载
4.ClassLoader是线程安全的吗?
ClassLoader类加载器是线程安全的,类加载是调用ClassLoader类的loadclass方法,loadClass方法是使用synchronize关键词修饰的。所以是线程安全的。
testClass = classLoader.loadClass("com.mashibing.my.Cpu_001");
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;
}
}
5.类加载的过程是什么样子的?
类加载过程如下:
1.先查询缓存,看缓存中是否存在,缓存中存在,直接返回
2.缓存不存在,会查询父类加载器,使用双亲委派机制,如果父类加载器不存在,继续查找父类的父类的加载器,如果父类的父类的加载器还是找不到,再查找子类的加载器,当最后子类都无法加载这个类的时候,才会报java.lang.ClassNotFoundException
6.类加载有几种方式?
三种方式
1.命令行启动程序,由JVM进行初始化
2.通过class.forname()方法动态加载
3.通过ClassLoader.classLoader()方法动态加载
7.参考
1.https://www.zhihu.com/question/46719811
2.https://www.cnblogs.com/duanxz/p/6108343.html
3.http://www.ityouknow.com/jvm/2017/08/19/class-loading-principle.html--类的加载机制 大佬的文章建议看n遍
我是厚积薄发,欢迎大家一键三连,欢迎大家留言。