标签:blog 就会 dea lips expand 动作 exp dex 应用程序
执行javac命令,启动java编译程序,将.java源代码文件编译为jvm可识别的.class字节码文件。
(我们用idea、eclipse编码出的就是.java源文件,启动后。target文件夹下就是编译后的.class字节码文件)
类加载器,将.class文件的二进制数据读入到内存中,存放到jvm内存结构的方法区内,并在堆中创建对应的class对象实例。
执行java命令,会启动jvm,加载运行时所需的类库,并执行class文件。
结合上图jvm内存结构可知,类加载的最终产品是位于堆中的class对象实例,class封装了类在方法区的数据结构
堆存在的对象实例,方法区存储了类信息,常量
java提供了三层类加载器,ClassLoader
BootstrapClassLoader;启动类加载器,主要负责加载核心的类库,java.lang.*等;
ExtClassLoader;扩展类加载器,主要负责加载jre/lib/ext目录下的一些扩展jar;
AppClassLoader;程序类加载器,主要负责加载应用程序的主函数类
当某个.class文件需要加载时
先在AppClassLoader加载器检查是否已经加载,如果没有加载,不会自己加载,而是将加载动作向上达到父类ExtClassLoader加载器;
父类ExtClassLoader加载器检查自己是否已经加载,如果没有加载,不会自己加载,继续向上委派给BootstrapClassLoader加载器;
BootstrapClassLoader加载器已经没有父类加载器了,如果没有加载,就要考虑自己是否能加载,自己不能加载,就会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException;
一个类加载器加载一个类时,首先把加载动作委派给父类加载器,由于类加载器会向上传递加载请求,所以一个类加载时,首先尝试加载它的肯定是启动类加载器
简单来说,把类加载器想象为人,自己没有钱就问他爸爸有没有钱,爸爸没有钱,就问爷爷有没有钱,爷爷已经没有人可以要钱了,只能自己赚钱了,发现自己年纪大了赚不了前,就让儿子去赚钱。。。
防止了危险代码的植入,整个流程中,BootstrapClassLoader最先加载尝试加载,其他自定义的加载器没有机会执行危险代码的加载;
Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子加载器再加载一次。
标签:blog 就会 dea lips expand 动作 exp dex 应用程序
原文地址:https://www.cnblogs.com/vicious/p/14751424.html