类加载小结
1.源码文件(.java)–>代码指向的过程
编译—>加载—>解释—>执行
1.1 编译
将源码文件编译成JVM可以解释的class文件。编译过程会对源代码程序做语法分析,语义分析,注解处理等等处理,最后才生成了字节码文件。
1.2 加载(我们后面要重点研究)
将编译后的class文件加载到jvm中。
1.3 解释
这个阶段它做的事情可以总结为:把字节码转换为操作系统识别的指令。
1.4 执行
操作系统把解释器解析出来的指令码,调用系统的硬件执行最终的秩序程序指令。
2. 类加载
2.1 什么是类加载
类(文件 Hello.class)-------> jvm(加载到内存的过程)
2.2类加载的顺序
2.2.1加载
加载class文件,同时会在内存中创建一个特殊的class对象。类.class/对象.getClass/Class.forName(包.类)
Car c =new Car();
System.out.println(c.getClass());
System.out.println(Car.class);
Class<?> clazz = Class.forName("com.dyit.classloader.Car");
2.2.1.1何时加class文件
为了节省内存的开销,并不会一次性把所有的类全部都加载值jvm,而是等到有需要的时候才进行装载
1.new Car();----->new
2.Class.forName(“包.类”);--------->反射
2.2.1.2谁来加载class文件
类加载器。。
- Bootstrap----->根加载器
- Extension-------->扩展加载器
- Application------------>系统加载器
这3个类加载器的关系:qpp------>继承了Ext------->继承了Bootstrap
System.out.println(clazz.getClassLoader());
System.out.println(clazz.getClassLoader().getParent());
System.out.println(clazz.getClassLoader().getParent().getParent());
2.2.1.3 加载规则:双亲委托机制
当前类加载器不会自己尝试去加载这个类,而是把请求委托给父加载器去完成,以此向上。
xxx.class---->Application(加载)------>Ext(检查)------->Bootstarp
2.2.2链接
验证class文件内容是否合法
- 验证
0xCAFEBABE,合法的class文件一般是以0x开头的16进制。 - 准备
为类变量(static修饰)分配内存空间,static–>方法区,初始化
class A{
static int x = 3; --->分配static内存 x=0;
}
- 解析
将class文件中的符号,接口等对应java中的符号接口等。
2.2.3初始化:对类变量的初始化
x=3;//对类变量进行初始化赋值
需要注意的是,普通变量依然没有初始化。普通变量的初始化在其构造方法内
2.2.4使用
2.2.5卸载
3. 小问题
String s =“abc”;创建了几个对象?
有可能1个(String.class),有可能2个(String.class,abc(常量池没有))
本文详细介绍了Java类加载的过程,包括编译、加载、解释和执行四个步骤。重点讲解了类加载的双亲委托机制,解释了何时加载类文件、谁来加载以及加载规则。还探讨了类的链接、初始化、使用和卸载阶段。此外,文章通过实例说明了类加载顺序,并提出了关于字符串对象创建的小问题。
1566

被折叠的 条评论
为什么被折叠?



