《深入理解JAVA虚拟机(第2版)》- 第6章 - 学习笔记

news2025/1/11 20:46:57

第6章 类文件结构

6.1 概述

字节码和二级制本地机器码(Native Code)是用来存储程序编译后的结果的,是二种程序存储结构。

6.2 无关性的基石

这里说的无关性,分为:平台无关性和语言无关性。

  1. 平台无关性:JVM和字节码是构成平台无关性的基石。

  2. 语言无关性:所谓语言无关性是说,不是只有Java语言编写的程序才能运行在JVM上,其他语言编写的程序也可以运行在JVM上。构成语言无关性的基石同样是JVM和字节码。

    Java虚拟机提供的语言无关性如图: 在这里插入图片描述 3. JVM不与编程语言绑定,它只与Class文件这种特定的二进制文件格式所关联。

6.3 Class文件的结构

  1. Class文件是一个以8位字节为基本单位的二进制流。
  2. Class文件是采用一种类似C语言结构体的伪结构来存储数据的,所存储的数据只有两类:无符号数和表。
    • 无符号数:

      无符号数属于基本数据类型,可以用来表示数字、索引引用、数量值、UTF-8编码的字符串。我们可以使用u1、u2、u4、u8分别来表示1个字节、2个字节、4个字节、8个字节的无符号数。

    • 表:

      表是由多个无符号数或其他表作为数据项而组成的复合数据类型,通常以“_info”来结尾。

  3. Class文件中头4个字节称为魔数(Magic Number),作用是基于这个魔数来判断当前虚拟机是否能接收这个Class文件。之所以采用这种方式来判断,而不是采用文件扩展名,也是出于安全的考虑,因为文件扩展名可以被随意修改。
  4. 紧跟魔数的后四个字节标识了Class文件的版本,5、6是次版本号(Minor Version),7、8是主版本号(Major Version)
  5. 紧跟主版本号之后的是常量池入口。常量池中的每一项常量就是一张表。常量池中主要存放两类常量:字面量和符号引用。
    1. 字面量

      例如:文本字符串、被final修饰的常量值

    2. 符号引号

      分为以下三类:

      • 类和接口的全限定名(Fully Qualified Name)

      • 字段的名称和描述符(Descriptor)

        这里的描述符是用来描述字段的数据类型。

      • 方法的名称和描述符

        这里的描述符是用来描述方法的参数(个数、类型、顺序)和返回值。

  6. Java代码在进行javac编译的时候,不会像C和C++那样有“连接”步骤,而是在虚拟机进行类加载的时候进行动态连接。
  7. 类的继承关系是通过类索引、父类索引、接口索引集合这三项数据来确定的。
  8. 方法表集合
    • 一个方法对应一个方发表,方发表的结构包括:访问标志(access_flags)、名称索引(name_index)、描述符索引(descriptor_index)、属性表集合(attributes)。 在这里插入图片描述
    • 方法表中有一个属性表集合,其中有一个Code属性是用来存放方法编译后的字节码,这个属性并不是每个方法都有,例如:接口中的方法和抽象类中的抽象方法就没有这个属性。
    • Code属性中字节码指令之后是这个方法的显示异常处理表(简称异常表)集合,异常表对于Code属性来说不是必须的(如果代码中没有异常处理的逻辑就没有这个异常表了)。编译器是采用显示异常处理表来实现Java异常和finally处理机制的,而不是通过简单的跳转命令
    • 属性表集合中还有一个Exception属性,这个属性与Code属性同级,与上边提到的显示异常处理表不同,Exception属性是用来列出方法的要抛出去的受检异常(Checked Exception),也就是方法上throws关键字后边跟着的异常。

6.4 字节码指令简介

  1. Java虚拟机的指令是由操作码(Opcode,一个字节)和操作数(Operands,即操作码的参数)组成的
  2. 由于Java虚拟机是基于操作数栈而不是寄存器的架构,所以大多数指令没有操作数(操作数都存放在操作数栈中了),只有一个操作码。
  3. 操作码的长度为一个字节(能表示的范围是0~255),即指令集中的操作码总数不能超过256。
  4. 加载和存储指令
    • 加载指令是用在从局部变量表中将数据加载到操作数栈中。
    • 存储指令是将操作数栈中的数据存储到局部变量中。
  5. 运算指令
    将两个操作数栈中的数据进行某种特定的运算,并将运算的结果在存储到操作数栈的栈顶。
    运算指令分为:整型数据运算指令和浮点数据运算指令。
  6. 同步指令
    Java虚拟机支持方法级同步一段指令序列同步,这两种同步结构都是通过管程(Monitor)来实现的。
    • 方法级同步
      方法级同步是隐式的,不需要字节码指令来支持,是在方法调用和返回操作中实现的。
    • 一段指令序列同步
      同步一段指令序列,通常使用的是synchronized语句块来实现的,synchronized关键字是通过指令集中monitorenter和monitorexit两个指令来支持的。

上一篇:《深入理解JAVA虚拟机(第2版)》- 第3章 - 学习笔记
下一篇:《深入理解JAVA虚拟机(第2版)》- 第7章 - 学习笔记

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

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

相关文章

Codeforces Round 913 (Div. 3) D. Jumping Through Segments (二分*1400)

很容易看出这道题应该二分答案,本题的难点在于对于mid的验证。 找距离肯定是不难,难就难在我们输入的区间并不是按照左右顺序排列的,有的区间可能涵盖住了另一个区间,也就是说在这里我们需要进行的是左右的移动。 那么我们根本无…

VBA数据库解决方案第十四讲:如何在数据库中动态删除和建立数据表

《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

【楼兰图腾】

题目 思路 本质上这个问题就是在求分别在一个数左边和右边的,大于该数的个数的乘积(小于同理) 维护一个下标指元素大小的线段树来方便求大于和小于某数值的元素个数 通过从左到右遍历,来确定此时的线段树状态一定不包括右边 因为…

【C++ Primer Plus习题】8.3

问题: 解答: #include <iostream> #include <string> #include <cctype> using namespace std;void function(string& str) {for (int i 0; i < str.size(); i){str[i]toupper(str[i]);} }int main() {string str;while (true){cout << "…

【超详细】深度学习的Hello World:使用pytroch训练一个自定义的手写体数字识别模型完整流程【附数据集与完整源码】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

Unet改进15:添加TripletAttention||减少冗余计算和同时存储访问

本文内容:在不同位置添加TripletAttention注意力机制 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 由于注意机制具有在通道或空间位置之间建立相互依赖关系的能力,近年来在各种计算机视觉任务中得到了广泛的研究和应用。在本文中,我们研究了轻量级但…

龙芯+FreeRTOS+LVGL实战笔记(新)——01准备开发环境

本专栏是笔者另一个专栏《龙芯RT-ThreadLVGL实战笔记》的姊妹篇&#xff0c;主要的区别在于实时操作系统的不同&#xff0c;章节的安排和任务的推进保持一致&#xff0c;并对源码做了改进和优化&#xff0c;各位可以先到本人主页下去浏览另一专栏的博客列表&#xff08;目前已撰…

C++STL之vector类:相关习题解析

目录 只出现一次的数字| 只出现一次的数字|| 只出现一次的数字||| 杨辉三角(vector>的理解) 删除排序数组中的重复项 删除排序数组中的重复项|| 数组中出现次数超过一半的数字 只出现一次的数字| . - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 我们都…

★ 算法OJ题 ★ 力扣15 - 三数之和

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;芝麻凛将和大家一起做一道双指针算法题--三数之和~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 解法一&#xff1a;排序 暴力枚举 利…

JavaEE:多线程进阶(常见的锁策略)

文章目录 常见的锁策略各种锁的概念 synchronized特点加锁过程 锁消除(编译器的优化策略)锁粗化(编译器的优化策略) 常见的锁策略 锁是一个非常广义的问题. synchronized只是市面上五花八门的锁的一种典型的实现.它是Java内置的,推荐使用的锁. 各种锁的概念 下面这些概念,一…

JavaScript程序结构

程序结构有三种&#xff1a;选择结构、循环结构 、顺序结构 一、选择结构 1、简介 根据条件进行判断&#xff0c;从而执行不同的操作&#xff0c;称为选择结构&#xff08;分支结构&#xff09;&#xff0c;其实就是条件判断 选择结构的类型&#xff1a;if、switch 2、if结…

第十七篇——九变篇:紧扣战略重心,别跑题

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 九变种前面偏向宏观给讲解了九变的含义&#xff1b;这一篇通过更加微观的…

如何基于numpy和scipy实现曲面的最大梯度计算与显示

大家在做三维可视化研究过程中,经常需要做三维曲面的绘制和相交分析,在不知道三维曲面方程的情况下,如何基于曲面散点数据计算曲面的最大梯度点和梯度线的三维可视化是大家基于曲面分析研究中的重点关注的问题,本文在python环境下,基于numpy、pandas、scipy和matplotlib等…

MYSQL————联合查询

联合多个表进行查询 设计数据时把表进行拆分&#xff0c;为了消除表中字段的依赖关系&#xff0c;比如部分函数依赖&#xff0c;传递依赖&#xff0c;这时会导致一条SQL查出来的数据&#xff0c;对于业务来说是不完整的&#xff0c;我们就可以使用联合查询把关系中的数据全部查…

dk安装redis

docker search redis docker pull redis 由于我是使用的镜像 所以我的拉取命令就是 docker pull dockerpull.com/redis 拉下镜像之后&#xff0c;点击下面地址选择自己需要的 redis 版本的配置文件 redis/redis.conf at 6.2.6 redis/redis GitHubRedis is an in-memory data…

Python和Java及MATLAB和CUDA显微镜导图

&#x1f3af;要点 交互式设备控制和图像处理图像背景和阴影校正可视化萤光团位置算法和读取光学图像读写转换显微镜图像生物医学细胞图像分析荧光图像算法计算亮度数据和模拟表征新型染料和缓冲液强度估计细菌图像分析扫描透射和高分辨率透射图像模拟多模态成像分割可视化透射…

python安装protobuf记录

需求背景 客户需要protobuf环境配置以及插件安装&#xff0c;我主要通过在pycharm里面配置参数&#xff0c;将问题解决&#xff01; 导语 Python中的protobuf(Protocol Buffers)是一种用于序列化结构化数据的语言无关、平台无关、可扩展的机制。它能够让您在不同的应用程序和语…

搭建基于QT的TCP服务器与客户端

1、实现功能 1、服务器和客户端能够建立连接 2、服务器可以给客户端发送信息 3、客户端可以给服务器发送信息 2、server 2-1、widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> QT_BEGIN_NA…

2024 年 IBM 量子开发者大会:等你来

在 2024 年 IBM Quantum™ 开发者大会上&#xff0c;与会者将获得 IBM Quantum 尖端工具和即将推出的路线图更新的独家、亲身预览&#xff0c;所有这些都围绕一个主题 — — Qiskit 的性能。 2024 年 IBM 量子开发者大会 在此申请 重要日期 7 月 24 日&#xff1a; 开放申请 8 …

leetcode 902. Numbers At Most N Given Digit Set

题目链接 Given an array of digits which is sorted in non-decreasing order. You can write numbers using each digits[i] as many times as we want. For example, if digits [1,3,5], we may write numbers such as 13, 551, and 1351315. Return the number of posit…