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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/23271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云平台WoSignSSL证书应用案例

沃通CA与阿里云达成合作并在阿里云平台上线WoSign品牌SSL证书。自上线以来&#xff0c;WoSignSSL证书成为阿里云“数字证书管理服务”热销证书产品&#xff0c;获得阿里云平台客户认可&#xff0c;助力阿里云平台政府、金融、教育、供应链、游戏等各类行业客户实现网站系统数据…

最全大数据毕业设计题目 - 100例

文章目录 0 前言1 如何选题1.1 选题技巧&#xff1a;如何避坑(重中之重)1.2 为什么这么说呢&#xff1f;1.3 难度把控1.4 题目名称1.5 最后 2 大数据 - 选题推荐2.1 大数据挖掘类2.2 大数据处理、云计算、区块链 毕设选题2.3 大数据安全类2.4 python大数据 游戏设计、动画设计类…

re学习(28)攻防世界 parallel-comparator-200(线程函数)

下载出来是个C语言编辑文件&#xff0c;添加注释如下所示&#xff1a; #include <stdlib.h> #include <stdio.h> #include <pthread.h> //linux的线程库&#xff0c;所以要在linux中才可运行 #define FLAG_LEN 20void * checking(void *arg) { //这道题…

举办活动发布会,如何得到媒体支持?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 举办活动发布会并得到媒体报道的支持是一个关键的宣传和推广手段。以下是一些建议&#xff0c;帮助你增加吸引媒体关注和报道的机会&#xff1a; 1. 策划新闻价值&#xff1a;确保你的发…

从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口测试是对系统…

为机器人装“大脑” 谷歌发布RT-2大模型

大语言模型不仅能让应用变得更智能&#xff0c;还将让机器人学会举一反三。在谷歌发布RT-1大模型仅半年后&#xff0c;专用于机器人的RT-2大模型于近期面世&#xff0c;它能让机器人学习互联网上的文本和图像&#xff0c;并具备逻辑推理能力。 该模型为机器人智能带来显著升级…

剑指Offer 58.左旋转字符串

58.左旋转字符串 目录 58.左旋转字符串题目代码&#xff08;字符串拼接&#xff09;利用切片函数同余简化代码利用StringBuilder 面试&#xff1a;StringBuilder与String的使用比较 题目 官网地址 代码&#xff08;字符串拼接&#xff09; class Solution {public String r…

【深度学习】在 MNIST实现自动编码器实践教程

一、说明 自动编码器是一种无监督学习的神经网络模型&#xff0c;主要用于降维或特征提取。常见的自动编码器包括基本的单层自动编码器、深度自动编码器、卷积自动编码器和变分自动编码器等。 其中&#xff0c;基本的单层自动编码器由一个编码器和一个解码器组成&#xff0c;编…

K8S 部署 RocketMQ

文章目录 添加模板部署本地访问 集群使用 kubesphere 作为工具 添加模板 添加 helm 模板 helm repo add rocketmq-repo https://helm-charts.itboon.top/rocketmq helm repo update rocketmq-repo编写 value.yaml 文件 配置主从节点的个数&#xff0c;例子为单节点 broker:…

Tool Documentation Enables Zero-Shot Tool-Usage with Large Language Models

本文是LLM系列文章的内容&#xff0c;针对《Tool Documentation Enables Zero-Shot Tool-Usage with Large Language Models》的翻译。 工具文档赋能大模型零样本的工具使用 摘要1 引言2 相关工作3 实验设置3.1 常规的工作流3.2 工具使用提示方法3.3 评估任务 4 实证研究结果4…

node debian 镜像 new Date 获取时间少 8 小时问题

问题 在 node debian 镜像中&#xff0c;用 (new Date()).getHours() 与系统时间&#xff08;东 8 区&#xff09;少了 8 小时 系统时间 $ node > (new Date()).getHours() 11容器中的时间 $ node > (new Date()).getHours() 3原 Dockerfile FROM node:20.5-bullsey…

snap xxx has “install-snap“ change in progress

error description * 系重复安装&#xff0c;进程冲突 solution 展示snap的改变 然后sudo snap abort 22即可终止该进程 之后重新运行install command&#xff5e;&#xff5e; PS: ubuntu有时候加载不出来&#xff0c;执行resolvectl flush-caches&#xff0c;清除dns缓存…

用python编写的软件有哪些,编写python 用什么软件

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;用python编写的软件有哪些&#xff0c;编写python 用什么软件&#xff0c;现在让我们一起来看看吧&#xff01; 随着互联网的迅速发展&#xff0c;新技术不断创新&#xff0c;万物互联的时代&#xff0c;企业对IT人员的…

【博客687】k8s informer的list-watch机制剖析

k8s informer的list-watch机制剖析 1、list-watch场景&#xff1a; client-go中的reflector模块首先会list apiserver获取某个资源的全量信息&#xff0c;然后根据list到的rv来watch资源的增量信息。希望使用client-go编写的控制器组件在与apiserver发生连接异常时&#xff0c…

【51单片机】晨启科技,酷黑版,音乐播放器

四、音乐播放器 任务要求&#xff1a; 设计制作一个简易音乐播放器&#xff08;通过手柄板上的蜂鸣器发声&#xff0c;播放2到4首音乐&#xff09;&#xff0c;同时LED模块闪烁&#xff0c;给人视、听觉美的感受。 评分细则&#xff1a; 按下播放按键A6开始播放音乐&#xff0…

SpringCloud入门Day01-服务注册与发现、服务通信、负载均衡与算法

SpringCloudNetflix入门 一、应用架构的演变 伴随互联网的发展&#xff0c;使用互联网的人群越来越多&#xff0c;软件应用的体量越来越大和复杂。而传统单体应用 可能不足以支撑大数据量以及发哦并发场景应用的框架也随之进行演变从最开始的单体应用架构到分布式&#xff08…

18. SpringBoot 如何在 POM 中引入本地 JAR 包

❤️ 个人主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;成功解决 BUG 合集 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; Spring Boot 是一种基于 Spring 框架的轻量级应用程序开发框架&#xff0c;它提供了快速开发应用程…

Palo Alto Networks® PA-220R 下一代防火墙 确保恶劣工况下的网络安全

一、主要安全功能 1、每时每刻在各端口对全部应用进行分类 • 将 App-ID 用于工业协议和应用&#xff0c;例如 Modbus、 DNP3、IEC 60870-5-104、Siemens S7、OSIsoft PI 等。 • 不论采用何种端口、SSL/SSH 加密或者其他规避技术&#xff0c;都会识别应用。 • 使用…

面试之快速学习c++11-函数模版的默认模版参数,可变模版,tuple

//学习地址&#xff1a; http://c.biancheng.net/view/3730.html 函数模版的默认模版参数 在 C98/03 标准中&#xff0c;类模板可以有默认的模板参数&#xff0c;如下&#xff1a; template <typename T, typename U int, U N 0> struct TestTemplateStruct {};但是…

CSS水平垂直居中

1.利用定位 margin:auto 2.flex布局 3.grid布局 一、利用positionmargin:auto <style>.outer {position: relative; /*父亲相对定位*/width: 200px;height: 200px;background-color: red;}.inner {position: absolute; /*儿子绝对定位*/top: 0;bottom: 0;left: 0;ri…