当前位置: 首页 > news >正文

JVM 类文件结构(class文件)

JVM

本文链接:https://blog.csdn.net/feather_wch/article/details/132116849

类文件结构

1、class文件的组成

  1. 无符号数:基本数据类型 u1 u2 u3 u4 描述
    1. 数字
    2. 字符串
    3. 索引引用
  2. 表:复合数据类型,无符号数 + 表组, _info结尾

2、class文件是大段字节序

方便阅读

3、class文件的组成部分

  1. 魔数
  2. 版本号
  3. 常量池
  4. 访问标志
  5. 类索引
  6. 父类索引
  7. 接口索引集合
  8. 字段表集合
  9. 方法表集合
// 魔数 咖啡
// 版本号
// 常量池
// 访问标志
// 类索引,父类索引,接口索引集合
final class Man extends Person implements IEat, ISleep{public static final String YEAR = "2023"String name; // 字段表集合public void talk(){ // 方法表集合//}
}

4、魔数是什么?

  1. 0xCAFEBABY 咖啡宝贝
  2. 4byte

5、版本号

  1. 次版本号:儿子在前 // 质子
  2. 主版本号:爸爸在后 // 纣王

常量池

6、常量池 = 入口 + 常量池

  1. 入口:u2,= 多少个常量
  2. 常量池:1个常量 = 1个表,
    1. 17种表 = U1 tag + 独立的结构

7、常量池中存放的内容

  1. 字面量(常量值,String)
  2. 符号引用
    1. 类和接口的名称
    2. 方法的名称和描述符,描述符()Ljava/lang/String;
    3. 字段的名称和描述符,描述符Ljava/lang/Object;
    4. 方法句柄和方法类型
    5. 动态调用点和动态常量

8、方法的描述符 ==> JNI方法描述符

方法的参数类型和返回类型

9、JNI中方法描述符(Method Descriptor)

  1. 唯一地标识一个方法
  2. 一个方法描述符为:(Ljava/lang/String;I)V 表示该方法有两个参数,分别为String类型和int类型,返回值类型为void。

10、JVM中方法句柄和方法类型是指什么? ===> 反射机制

  1. 方法句柄(MethodHandle):可以看作是一个轻量级的函数指针,用于表示对方法的调用。
  2. 方法类型(MethodType)描述了方法的参数类型和返回类型。
  3. 两者通常一起使用:
Person person = new Person();
MethodType methodType = MethodType.methodType(void.class);
MethodHandle methodHandle = MethodHandles.lookup().findVirtual(Person.class, "sayHello", methodType);
methodHandle.invokeExact(person);

11、JVM中的动态调用点

  1. 指的是在程序运行时根据实际对象类型来确定要调用的方法。这种调用方式称为【动态分派】 ===> JVM 方法调用
  2. 动态调用点通常发生在针对多态类型的方法调用中。
  3. 动态调用点的确定是在运行时发生的,使用了虚方法表(virtual method table)来存储对象的方法信息,以便在运行时进行动态分派。
    1. 在虚方法表中,每个方法对应一个偏移量,通过偏移量可以找到对应的方法实现。 ===> 虚方法表

12、JVM中的动态常量

  1. 运行时才确定常量的数值
  2. 有性能开销
public class Main {public static final int MAX_VALUE = calculateMaxValue();public static int calculateMaxValue() {// 这里可以是一些复杂的逻辑来计算最大值return 100;}public static void main(String[] args) {System.out.println("最大值:" + MAX_VALUE);}
}

访问标志-access_flags

  1. class是类、接口、注解还是枚举
  2. 是否是public、abstract等

类索引

1、类索引是什么?

  1. 用于到常量池中寻找:类的全限定名

父类索引

  1. U2
  2. 用于到常量池中寻找:父类的全限定名

接口索引集合

  1. 入口 + 索引表集合(U2集合)
  2. 用于到常量池中寻找:接口的全限定名

字段表集合

  1. 入口 + 字段表
  2. 描述类和接口中声明的字段
  3. 字段表中每一项包含的内容
    1. 访问标志
    2. 名称索引 -> 常量池中
    3. 描述符索引 -> 常量池中
    4. 属性表集合 = 入口 + 属性表
      1. 举例:final static int a = 123, 在属性表中会有COnstantValue属性 ===> 类加载阶段

方法表集合

  1. 入口 + 方法表
  2. 访问标志 + 名称索引 + 描述索引 + 属性表集合

2、特征签名是什么?

  1. 方法重载的时候,Java中特征签名 = 方法参数在常量池中符号引用的集合
  2. class中特征签名 = 返回值 + 方法参数在常量池中符号引用的集合

属性表

1、属性表的主要属性 ===> APT ===> ASM

  1. Code
  2. Exception
    1. 和异常表不同 ===> ?
    2. 展示方法需要检查哪些异常
  3. ConstantValue ===> 类加载机制,准备阶段
    int x = 123; // <init()>实例构造方法中赋值
    static int x = 123; // <clinit>类构造器中赋值
    final static int x = 123; //ConstantValue属性,在【准备阶段】赋值
    

2、Code属性的结构

  1. 属性名
  2. 属性长度
  3. 操作数栈最大深度
  4. 局部变量表的存储空间(slot为单位):不等于局部变量表最大值,会复用
  5. 字节码长度:总长度
  6. 字节码指令:多个指令
    1. aload_0、invokespecial、init等指令
  7. 异常表
    1. start_pc
    2. end_pc
    3. catch_type
    4. handler_pc

相关文章:

JVM 类文件结构(class文件)

JVM 本文链接&#xff1a;https://blog.csdn.net/feather_wch/article/details/132116849 类文件结构 1、class文件的组成 无符号数&#xff1a;基本数据类型 u1 u2 u3 u4 描述 数字字符串索引引用 表&#xff1a;复合数据类型&#xff0c;无符号数 表组&#xff0c; _inf…...

PAT乙题1011

答案 #include<iostream> #include<cstdio> using namespace std; typedef long long int ll; int main() {int n,cnt1;cin >> n;while (n--){ll a, b, c; cin >> a >> b >> c;printf("Case #%d: ", cnt);a b > c ? puts(…...

【并发专题】单例模式的线程安全(进阶理解篇)

目录 背景前置知识类加载运行全过程 单例模式的实现方式一、饿汉式基本介绍源码分析 二、懒汉式基本介绍源码分析改进 三、懒汉式单例终极解决方案&#xff08;静态内部类&#xff09;&#xff08;推荐使用方案&#xff09;基本介绍源码分析 感谢 背景 最近学习了JVM之后&…...

无涯教程-Perl - if...elsif...else语句函数

if 语句后可以跟可选的 elsif ... else 语句&#xff0c;这对于使用单个if ... elsif语句测试各种条件非常有用。 if...elsif...else - 语法 Perl编程语言中的 if ... elsif...else语句的语法是- if(boolean_expression 1) {# Executes when the boolean expression 1 is tr…...

uniapp 实现滑动元素并下方有滚动条显示

用uniapp实现下图的样式 代码如下&#xff1a; <template><view class"content"><view class"data-box" ref"dataBox" touchend"handleEnd"><view class"data-list"><view class"data-ite…...

QT充当客户端模拟浏览器等第三方客户端对https进行双向验证

在 ssl单向证书和双向证书校验测试及搭建流程 文章中&#xff0c;已经做了基于https的单向认证和双向认证&#xff0c;&#xff0c;&#xff0c; 在进行双向认证时&#xff0c;采用的是curl工具或浏览器充当客户端去验证。 此次采用QT提供的接口去开发客户端向服务器发送请求&a…...

【JVM】 垃圾回收篇——自问自答(1)

Q什么是垃圾&#xff1a; 运行程序中&#xff0c;没用任何指针指向的对象。 Q为什么需要垃圾回收&#xff1f; 内存只分配&#xff0c;不整理回收&#xff0c;迟早会被消耗完。 内存碎片的整理&#xff0c;为新对象腾出空间 没有GC程序无法正常进行。 Q 哪些区域有GC&#…...

Image Line FL Studio v21.0.3.3517 Producer版全插件版WIN免费下载完整版

FL Studio 21&#xff0c;也称为 Fruity Loops 21&#xff0c;是一款功能强大的数字音频工作站&#xff0c;被世界各地的音乐制作人和 DJ 使用。无论您是新手还是经验丰富的制作人&#xff0c;FL Studio 21都能为您提供创作专业品质音乐所需的工具。在这篇博文中&#xff0c;我…...

PHP8条件控制语句-PHP8知识详解

我们昨天说了流程控制的结构有顺序结构、选择结构和循环结构。选择结构就是条件结构。 条件控制语句就是对语句中不同条件的值进行判断&#xff0c;进而根据不同的条件执行不同的语句。 在本文中&#xff0c;学习的是if语句、if…else语句、if…elseif语句和switch语句。 1、…...

【PHP代码审计】ctfshow web入门 php特性 93-104

ctfshow web入门 php特性 93-104 web 93web 94web 95web 96web 97web 98web 99web 100web 101web 102web 103web 104 web 93 这段PHP代码是一个简单的源码审计例子&#xff0c;让我们逐步分析它&#xff1a; include("flag.php");: 这行代码将flag.php文件包含进来。…...

CSS元素的显示模式

1、现在我想做成小米左侧边栏这样的效果&#xff0c;该怎么做呢&#xff1f; 2、小米商城触碰之后会显示出新的商品案例 3、一碰到之后会出现这个列表 4、这里涉及到了元素显示模式&#xff1a; 5、用人进行划分可以分为男人和女人&#xff0c;根据男人和女人的特性进行相应的…...

Go strings.Title方法被废弃(Deprecated)

strings.Title的使用 在传统中&#xff0c;我们可以通过如下形式将每个单词的首字母变成大写字母&#xff0c;示例如下&#xff1a; func TestTitle(t *testing.T) { fmt.Println(strings.Title("hello world")) fmt.Println(strings.Title("hell golang&qu…...

vuejs源码分析之全局API(vm.$off)

vue在初始化的时候会给vue对象本身挂载一些全局的api。今天我们一个一个来看这些api。 vm.$off方法 这个方法是用来移除自定义事件监听器。 他的用法 vm.$off(event, calback)第一个参数event取值可以是string字符串&#xff0c;也可以是Array<string>也就是说既可以删…...

elasticSearch常见的面试题

常见的面试问题 描述使用场景 es集群架构3个节点&#xff0c;根据不同的服务创建不同的索引&#xff0c;根据日期和环境&#xff0c;平均每天递增60*2&#xff0c;大约60Gb的数据。 调优技巧 原文参考&#xff1a;干货 | BAT等一线大厂 Elasticsearch面试题解读 - 掘金 设计阶…...

第一课-前提-Stable Diffusion 教程

学习 SD 的前提是电脑配置! SD 参考配置: 建议选择台式机 i5 CPU, 内存16GB,N卡 RTX3060, 8G显存以上的配置(最低配) 在此基础上的配置越高越好。 比如,cpu i7 更好,显卡能有 RTX4090 更好,32显存要能有最好,嘿嘿嘿。 如何查看自己的显卡配置? Win+R 输入 “dxdiag…...

Python 开发工具 Pycharm —— 使用技巧Lv.2

pydoc是python自带的一个文档生成工具&#xff0c;使用pydoc可以很方便的查看类和方法结构 本文主要介绍&#xff1a;1.查看文档的方法、2.html文档说明、3.注释方法、 一、查看文档的方法 **方法1&#xff1a;**启动本地服务&#xff0c;在web上查看文档 命令【python3 -m…...

代码随想录第39天 | 62. 不同路径、63.不同路径II

62. 不同路径 动态规划五部曲&#xff1a; dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) 有dp[i][j]条不同的路径。想要求dp[i][j]&#xff0c;只能有两个方向来推导出来&#xff0c;即dp[i - 1][j] 和 dp[i][j - 1]。dp[i]…...

QMT入门—初识QMT

对于普通投资者来说&#xff0c;每天实时盯盘实在是无聊又无趣&#xff0c;特别是临时有事还会错过行情。如果能把自己的投资策略用代码实现&#xff0c;通过程序来自动买卖股票那该有多好&#xff0c;这样就不会错过行情也不会不按交易纪律来操作了。 解决办法有两种&#xf…...

C 语言的 return 语句

有返回值的函数要带 return 语句, return 后面是一个表达式, return 语句将表达式的值返回给主调函数. 一个函数也可以有多个 return 语句, 比如存在于不同的分支中, 但只能有一条 return 语句被执行, 然后程序的控制权就从被调函数传到主调函数. 对于有返回值但没有带 retur…...

企业级Vue路由角色权限应该怎么做?

角色权限 角色权限&#xff0c;简单来说就是登录的用户能看到系统的哪些页面&#xff0c;不能看到系统的哪些页面。一般是后台管理系统才会涉及到如此复杂的角色权限。 对于 vue 技术栈&#xff0c;实现角色权限一般有两种方式。 第一种是利用 beforeEach 全局前置守卫。 第…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...