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修饰的变量或语句进行初始化。
如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。
填写下面表单即可预约申请免费试听!害怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
预约申请免费听课
- 地区:
- 北京
- 天津
- 上海
- 江苏
- 浙江
- 山东
- 江西
- 安徽
- 广东
- 广西
- 海南
- 辽宁
- 吉林
- 黑龙江
- 内蒙古
- 山西
- 福建
- 河南
- 河北
- 湖南
- 湖北
- 四川
- 重庆
- 云南
- 贵州
- 新疆
- 西藏
- 陕西
- 青海
- 宁夏
- 甘肃
- 姓名:
- 手机: