JVM字节码文件结构深度剖析

JVM字节码文件结构深度剖析

常量池类型分类

字节码文件

什么是魔数

  • 字节码文件的前4个字节CAFEBABE

常量池

  • 字面量: 指赋予成员变量的值,例如:String s = "hello","hello"就是字面量
    • 文本字符串
    • final的常量值
    • 基本数据类型值
    • 其他
  • 符号引用: 指类中方法的名称
    • 类和接口的全类名
    • 字段的名称和描述符
    • 方法的名称和描述符

字节码文件结构

  • 魔数
  • 主次版本号
  • 常量池计数
  • 本类索引
  • 父类索引
  • 接口计数
  • 字段计数
  • 方法计数
  • 属性计数

常见问题

class文件组成

  • class字节码文件由魔数、主次版本号、常量池、类信息、类的构造方法、类的中的方法信息、类变量与成员变量等信息组成

为什么我们在实例方法中可以调用this

  • this在编译的时候,会被作为第一个入参,也就是一个隐式入参放到局部变量表的第一个位置,即使构造方法没有参数,也会占用一个位置

如何定位到我们异常的代码

  • JVM会维护一个LineNumberTable,对应的字节码和代码会通过这个来维护,所以会通过这个来定位

解释下字节码里面加载和存储指令是什么

  • 用于将数据再栈帧中的局部变量表和操作数栈之间来回传输,这类指令包括
    • 将一个局部变量加载到操作数栈
      • iload、iload_<n>
      • lload、lload_<n>
      • fload、fload_<n>
      • dload、dload_<n>
      • sload、sload_<n>
    • 将一个数值从操作数栈存储到局部变量表
      • istore、istore_<n>
      • lstore、lstore_<n>
      • fstore、fstore_<n>
      • dstore、dstore_<n>
      • astrore、astore_<n>
    • 将一个常量加载到操作数栈
      • bipush、sipush、idc、idc_w、idc2_w、aconst_null、iconst_m1、iconst<i>、lsconst_<i>、fconst_<i>、dconst_<i>
    • 扩充局部变量表的访问索引
      • wide

解释下字节码里面方法调用指令有哪些

  • invokevirtual: 用于调用对象的实例方法,根据对象的实际类型进行分派(虚拟方法派),这也是Java语言中最常见的方法分派方式
  • Invokeinterface: 用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用
  • Invokespecial: 用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和父类方法
  • Invokestatic: 用于调用静态类方法
  • Invokedynamic: 用于在运行时动态解析出调用点限定符所引用的方法,并执行该方法,前面4条指令的反派逻辑都固化在Java虚拟机内部,而invokedynamic指令的分派逻辑是由用户所设定的引导方法决定的,方法调用时用指令与数据类型无关
相关推荐
CS创新实验室17 小时前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
wuminyu19 小时前
JMM学习总结:深入理解happens-before关系
java·linux·c语言·jvm·c++
DongQiShanRen1 天前
六根硬件映射(下):物理闭环五步法,抽一条已实装的看
大数据·jvm·人工智能·算法·rust·哈希算法·集成学习
乌暮1 天前
从 `println` 到生产级日志:Spring Boot 日志体系完全指南
java·开发语言·jvm·spring boot·后端·学习·面试
Sayai1 天前
Java 进程 Unable to create new native thread 排查实战:Linux 线程数五层限制与 JVM -Xss 调优
java·linux·运维·jvm·性能优化
wuminyu1 天前
Continuation::freeze与thaw的x86_64汇编Stack Chunk拆解源码分析
java·linux·c语言·汇编·jvm·c++
金銀銅鐵2 天前
[Java] 借助GUI展示class文件的内容(v1.0版本)
jvm·后端·ai编程
kunicoding2 天前
多线程编程核心概念详解:从线程基础到并发安全
java·jvm·安全
云老大-阿里云国际站代理商2 天前
华为云国际站渠道代理商:CSS查询很慢但CPU不高?磁盘I/O、JVM与分片问题怎么排查
css·jvm·华为云
呆呆虫122 天前
SerpBase 省 credit 实战:缓存 + 去重,把重复请求砍掉一半
jvm·缓存