目录
运行时数据区
类生命周期
类加载器
先有C后有java。应用程序加载器,就是加载开发人员编写的代码。
验证问题
查看类对应的加载器
核心类库:String、Object等都属于核心类库。
/**
* 查看类的加载器实例
*/
public class ClassLoaderView {
public static void main(String[] args) throws Exception {
// 加载核心类库的 BootStrap ClassLoader
System.out.println("核心类库加载器:"
+ ClassLoaderView.class.getClassLoader().loadClass("java.lang.String").getClassLoader());
// 加载拓展库的 Extension ClassLoader
System.out.println("拓展类库加载器:" + ClassLoaderView.class.getClassLoader()
.loadClass("com.sun.nio.zipfs.ZipCoder").getClassLoader());
// 加载应用程序的
System.out.println("应用程序库加载器:" + ClassLoaderView.class.getClassLoader());
// 双亲委派模型 Parents Delegation Model
System.out.println("应用程序库加载器的父类:" + ClassLoaderView.class.getClassLoader().getParent());
System.out.println(
"应用程序库加载器的父类的父类:" + ClassLoaderView.class.getClassLoader().getParent().getParent());
}
}
结果
核心类库加载器:null
拓展类库加载器:sun.misc.Launcher$ExtClassLoader@6f94fa3e
应用程序库加载器:sun.misc.Launcher$AppClassLoader@18b4aac2
应用程序库加载器的父类:sun.misc.Launcher$ExtClassLoader@6f94fa3e
应用程序库加载器的父类的父类:null
JVM如何知道我们都类在何方
类不会重复加载
类名一样,代表同一个类。在次情况下,类被修改,不会重复加载。
类的卸载
有些情况会用到动态生成类的过程。
双亲委派模型
模型只是一种行为都约束。
父子关系是一种上下级关系,逻辑定义的,目的是为了委派。
每一个类加载器都有一个具体的搜索目录,具体的位置,这个位置存储了类的信息,一个类不会去重新加载一个类。
每一个类加载器首先不会尝试自己去加载,而是委派给父类来加载。如果没有指定,则会以ExtClassLoader和Bootstarp作为逻辑上的附加载器。
这种模型目的是为了降低重复加载的问题,也是为了安全问题考虑。例如你用一个别人的jar包,如果别人写了Object被加载了,没有实现对应方法,就会很诡异。
热加载功能:通过不断创建新的类加载器来加载修改后的类。