【JVM】字节码文件

本文详细介绍了字节码文件的组成,包括魔数、版本信息、访问标识、常量池、字段、方法和属性等。重点讲解了类加载过程,如类加载器的作用、验证、内存分配及初始化。还涉及了Java虚拟机规范和类加载器的种类与工作原理。
摘要由CSDN通过智能技术生成

字节码文件详解

字节码文件的组成

字节码文件本质上是一个二进制文件,无法直接用记事本等工具打开阅读器内容。需要通过专业的工具打开。

  1. 开发环境使用jclasslib插件。
  2. 服务器环境使用javap -v命令。

字节码文件:

  1. 基本信息:魔数Cafe babe、字节码文件对应的Java版本号、访问标识(public、final等)、父类和接口。
  2. 常量池:保存了字符串常量、类或接口名、字段名,主要在字节码指令中使用。
  3. 字段:当前类或接口声明的字段信息。名字、标识符(字段类型)、访问标识。前两指向常量池。
  4. 方法:当前类或接口声明的方法信息,字节码指令。方法信息包括:方法名、描述符(参数和返回值)、访问标识。
  5. 属性:类的属性,比如源码的文件名,内部类的列表等。

在这里插入图片描述

  1. 加载:

    1. 类加载器根据类的全限定名获取字节码信息。

    2. 类加载器在加载完类后,Java虚拟机会将字节码中的信息保存到内存的方法区中。在方法区生成一个InstanceKlass对象,保存类的所有信息。

    3. 在堆中生成一份与方法区中数据类似的java.lang.Class对象,作用是在Java代码中去获取类的信息。

      • 比如这段代码中,就会访问堆中的Class对象:

      在这里插入图片描述

  1. 连接:
    1. 验证:验证内容是否满足《Java虚拟机规范》。
    2. 准备:给静态变量赋初值。final变量直接赋值。
    3. 解析:将常量池中的符号引用替换成指向内存的直接引用。
  2. 初始化:执行静态代码块中的代码,并为静态变量赋值。执行字节码文件中clinit部分的字节码指令。
  3. 使用
  4. 卸载:需要同时三个条件
    1. 此类的所有实例对象已被回收
    2. 加载该类的类加载器已经被回收。
    3. 该类对应的java.lang.Class对象没有在任何地方被引用。

验证中有:

  1. 文件格式,0xCAFEBABE开头,主次版本号(java8是45)
  2. 元信息验证,比如类必须有父类 object
  3. 符号引用验证,是否访问其它类的private

new一个对象的过程

在这里插入图片描述

  1. 检查是否类加载
  2. 分配内存空间
    1. 分配方式:根据堆中内存是否规整,有两种分配内存的方式。指针碰撞;空闲列表。
    2. 并发问题:两种解决方案。cas对分配内存的动作进行同步处理;TLAB本地线程分配缓冲,每个线程在java堆中预先分配一小块内存,优先从TLAB中分配。
  3. 初始化零值
  4. 设置对象头
  5. 执行init() 方法

什么是类加载器

  1. 启动类加载器(Bootstrap ClassLoader) 加载核心类。
  2. 扩展类加载器(Extension ClassLoader)加载扩展类。
  3. 应用程序类加载器(Application ClassLoader)加载classpath中的类。
  4. 自定义类加载器,重写findClass方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值