JVM面试题---JVM类加载机制和对象的生成过程简单分析

1. 类加载机制

类加载过程图示

1.1 过程概要 ⭐

  • 加载:将class文件中的类信息通过二进制流的形式加载到JVM内存中
  • 连接包括三个步骤
    • 验证:主要是判断是否符合Class文件规范,保证JVM安全性
    • 准备:为类静态变量分配内存并初始化零值。
    • 解析:将常量池中的符号引用替换为直接引用。
  • 初始化
  • 最后两个步骤使用卸载(不太关注)

1.2 过程分析

① 加载

  • 通过全类名来加载定义该类的二进制字节流。
  • 将字节流所代表的静态存储结构转换为方法区的运行时数据结构
  • 在堆内存中生成代表该类的Class对象,作为方法区这个类各种数据的访问入口

注意:之所以使用定义该类这个词而不直接使用Class文件是因为类的定义不一定是以Class文件的形态来表示的,还有jar,加密文件,网络传输,数据库存储,运行时生成(动态代理),等各种形态来定义对象,但他们的本质都是一串二进制字节流。

② 连接

步骤一:验证

简单来说就是验证是否符合Class文件规范,保证JVM安全性

  • 文件格式验证,验证字节流是否符合Class文件格式规范。
  • 元数据验证
  • 字节码验证
  • 符号引用验证

步骤二:准备

类静态变量分配内存并初始化零值。

注意:这一阶段初始化的变量只包括类变量(static修饰的变量),不包括实例变量,实例变量在对象的实例化过程中一起分配到堆中,其次static变量在准备阶段只是初始化零值,赋值动作发生在类的初始化阶段。

步骤三:解析

将常量池中的符号引用替换为直接引用,简单来说就是直接将引用定位到常量池中的内存地址。

③ 初始化

​ 初始化是类加载过程中的最后一个步骤,主要是执行类构造器中的方法,该方法不是程序员定义的方法,是编译器自动收集类中的static变量赋值和静态语句块中的语句合并而成的

2. Java虚拟机对象的创建过程

2.1 对象的创建过程

在这里插入图片描述

2.2 对象的内存布局

对象在内存中分为三部分

  • 对象头(Header)
    • 运行时自身数据(Mark Word)…
    • 类型指针,指向实例的类型Class
    • 数组大小,数组类型才有
  • 实例数据(Instance Data)
    • 对对象定义的数据,字段(包括继承自父类的)
  • 对其填充(Padding)
    • 实例的大小必须是8^n,不满就需要对其填充

对对象头中运行时自身数据的详细描述:

在这里插入图片描述

  • hash值
  • 锁状态,锁标志位
  • 分代年龄

参考资料
书籍《深入理解Java虚拟机》周志明
博客 掘金好文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值