计算机系统应用教程网站

网站首页 > 技术文章 正文

jvm类加载机制 jvm类加载机制 面试

btikc 2024-11-02 11:08:50 技术文章 3 ℃ 0 评论

一、加载

1.通过“类全名”来获取定义此类的二进制字节流

2.将字节流所代表的静态存储结构转换为方法区的运行时数据结构

3.在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口

二、验证

1.文件格式验证

2.元数据验证:对字节码描述的信息进行语义分析,包括顶级父类Object验证、final是否被继承、抽象类的子类是否实现了相关抽象方法等

3.字节码验证:保证被校验类的方法在运行时不会做出危害虚拟机安全的行为,例如:不能把一个父类对象赋值给子类数据类型

4.符号引用验证:比如权限修饰符

三、准备

为类变量分配内存并设置类变量初始值并在方法区中分配内存,但并不是初始化准备过程只是为i设置初始值0,并不进行变量初始化

四、解析

虚拟机常量池内的符号引用替换为直接引用的过程,在执行anewarry、checkcast、getfield、instanceof、invokeinterface、invokespecial、invokestatic、invokevirtual、multianewarray、new、putfield和putstatic这13个用于操作符号引用的字节码指令之前,先对它们使用的符号引用进行解析

1.类、接口的解析

2.字段解析

3.类方法解析

4.接口方法解析

五、初始化

初始化阶段是执行类构造器<clinit>()方法的过程,类构造器<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的,一下四个场景会触发初始化:

1.遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初始化,则需先触发其初始化。生成这4条指令的最常见的java代码场景是:使用new关键字实例化对象、读取或设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)的时候,以及调用类的静态方法的时候。

2.使用java.lang.reflect包的方法对类进行反射调用的时候

3.当初始化一个类的时候,如果发现其父类还没有进行过初始化、则需要先出发其父类的初始化

4.jvm启动时,用户指定一个执行的主类(包含main方法的那个类),虚拟机会先初始化这个类

如果对编程感兴趣,想了解更多的编程知识,解决编程问题,以及入门指导,帮你解决编程中遇到的困惑,请加微信858568103

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表