java

导航

2020年java常见面试题及答案:第六部分

来源 :中华考试网 2020-09-30

  类加载过程

  ①加载:将外部的.class文件调入内存,在.class文件加载至方法区后,会在堆中创建一个java.lang.Class对象,对来封装类的信息,类加载的最终产物就是位于堆中的Class对象(注意不是目标类对象),该对象封装了类在方法区中的数据结构,并且向用户提供了访问方法区数据结构的接口,即Java反射的接口。

  ②将java类的二进制代码合并到JVM的运行状态之中的过程

  验证:确保加载的类信息符合JVM规范,没有安全方面的问题

  准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配

  解析:虚拟机常量池的符号引用替换为字节引用过程

  概念解释:

  JVM中的直接引用和符号引用

  符号引用:

  官方:符号引用以一组符号来描述所引用的目标。符号引用可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可,符号引用和虚拟机的布局无关。

  个人理解:在虚拟机编译java类为class文件,在编译时不知道引用类的地址,这个时候多以符号来代替。在JVM加载类的解析阶段将这个符号转化为实际的内存地址。

  直接引用:

  官方:直接引用和虚拟机的布局是相关的,不同的虚拟机对于相同的符号引用所翻译 出来的直接引用一般是不同的。如果有了直接引用,那么直接引用的目标一定被加载 到了内存中。

  个人理解:1. 直接指向目标的指针(指向对象,类变量,类方法的指针)

  2. 相对偏移量(指向实例的变量,方法的指针)

  3. 一个间接定位到对象的句柄。

  PS:偏移量:存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也称为“有效地址或偏移量”

  ③初始化

  这个阶段主要是对类变量初始化,是执行类构造器的过程。

  换句话说,只对static修饰的变量或语句进行初始化。

  如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。

  如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。

  填写下面表单即可预约申请免费试听!害怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

分享到

相关资讯