建筑公司网站大全,哪些软件可以做网页,建立企业网站的步骤,网站域名注册规则加载过程
JVM的类的加载过程分为五个阶段#xff1a;加载、验证、准备、解析、初始化。 加载 加载阶段就是将编译好的的class文件通过字节流的方式从硬盘或者通过网络加载到JVM虚拟机当中来。#xff08;我们平时在Idea中书写的代码就是放在磁盘中的#xff0c;也可以通…加载过程
JVM的类的加载过程分为五个阶段加载、验证、准备、解析、初始化。 加载 加载阶段就是将编译好的的class文件通过字节流的方式从硬盘或者通过网络加载到JVM虚拟机当中来。我们平时在Idea中书写的代码就是放在磁盘中的也可以通过网络加载到虚拟机
验证 验证阶段主要是验证class文件的格式或者内容是否符合java规范和虚拟机规范比如最常见的字节码文件中的cafe baby以及通过class文件是u2或者u4的的方式解析字节码中各部分的内容是否符合规范。
准备 准备阶段就是给静态变量static修饰的变量赋默认值的过程int类型的赋值为0对象类型赋值为null,这都是默认值需要注意的是常量也就是被final修饰的static在类编译的时候就已经赋值完成了。
解析 解释阶段做的事情用一句话来说就是将符号引用转变为直接引用句柄 句柄如下如所示虚拟机有两种引种对象数据的方式一种是通过句柄池的方式一种是通过直接指针的方式句柄池的方式就是在引用和真实地址之间多了一层句柄这样的好处就是当引用的真实对象发生改变时栈中存放的值不需要改动但是多了一层就会增加系统的复杂性所以hotsport虚拟机用的是直接地址指针的方式如下图。 直接引用数据在内存中的真实地址 **符号引用**包括一些方法名和字面量等这些符号引用在加载过程中有的可以确定下来的比如static修饰的main方法这些可以确定下来的引用在解析过程中就会转变为指向真实地址的指针还有一些是只有在实际运行期间才可以确定下来的比如多态接口等这些就需要到真正调用的时候才转为直接地址引用。这也就是静态连接和动态连接的区别 初始化 类的初始化是将给静态变量赋值这时候的赋值才是赋代码中书写的值静态代码块收集在一起进行执行的过程其实就是执行字节码中的clinit方法注意这个方法不是类的构造方法执行顺序根据静态变量和静态代码块在类中的顺序决定。代码如下
public class Hello {//准备阶段给a赋值为0.初始化的时候给a赋值为3public static int a3;//根据顺序先执行a3,在实行静态方法static {String bb;}public static void main(String[] args) {}}注意类的初始化实例化对象
双亲委派机制
类的加载过程同通过类加载器实现的。类的加载器主要有如下几种 引导类加载器c代码实现负责接在java的核心类库,比如rt.jar等 扩展类加载器加载java的一些扩展类负责加载jre下ext扩展目录下的jar报 应用类加载器负责加载classpath下的类也就是我们自己写的类 自定义类加载器我们自己写的写的类加载器负责加载自定义路径下的类
这些类加载器是有父子关系的父子关系通过类中一个parent属性关联起来这一点与extends是不同的。应用类加载器的父亲是扩展类加载器扩展 类加载器的父亲是引导类加载器。引导类加载器是c代码实现的通过扩展类加载器的parent属性获取到的值是null这些类加载器是怎么来的呢 在java程序运行起来以后虚拟机启动起来以后会通过 C代码创建引导类加载器引导类加载器加载java启动器Launcher然后由启动器Launcher负责加载扩展类加载器和引用程序加载器在创建应用程序加载器的时候是将先前创建好的扩展类加载器传给应用程序加载器的创建方法将应用程序类加载器的parent设置为扩展类加载器将扩展类加载器的parent设置为null,因为扩展类加载器的父亲引导类加载器是c代码实现的。 总结 引导类加载器是C程序创建的引导类加载器器加载启动器Launcher,Launcher创建扩展类加载器和应用程序加载器在创建应用程序加载器的时候将它的父亲设置为扩展类加载器。