栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 1. 类加载机制
    • 1.1 过程概要 ⭐
    • 1.2 过程分析
      • ① 加载
      • ② 连接
      • ③ 初始化
  • 2. Java虚拟机对象的创建过程
    • 2.1 对象的创建过程
    • 2.2 对象的内存布局

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虚拟机》周志明
博客 掘金好文

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/323301.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号