概念
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接时候用的Java类型。
类的生命周期
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载。其中验证、准备、解析统称为连接
类加载器
-
启动类加载器(Bootstrap ClassLoader)
-
扩展类加载器(Extension ClassLoader)
-
应用程序类加载器(Application ClassLoader)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NNgFrK3S-1592739196040)(C:\Users\Thinkpad\Desktop\Typora\jvm\类加载器.jpg)]
双亲委派模型
- 定义:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,只有当父加载器反馈自己无法完全这个加载请求时,子加载器才会尝试自己去加载。
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// 通过findLoadedClass方法判断当前类是否已经被加载,如果已加载则直接返回class,否则则 //加载类
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();
}
}
//resolve如果为false,表示不会执行静态块和静态对象就
if (resolve) {
resolveClass(c);
}
return c;
}
}
;
}
return c;
}
}