字节码基础

news2024/10/5 13:07:52

基本概念

java中的字节码,英文bytecode。是java代码编译后的中间代码格式。JVM需要读取并解析字节码才能执行相应的任务。java字节码是JVM的指令集。JVM加载字节码格式的class文件。校验之后通过JIT编译器转换成本机机器代码执行。

java字节码简介

1、java bytecode由单字节(byte)的指令组成,理论上最多支持256个操作码。实际上java只使用了200左右的操作码,还有一些操作码则保留给调试操作。

2、操作码(指令),主要有“类型前缀”和“操作名称”两部分组成。

3、指令性质分类,主要分成四个大类

--- 栈操作指令,包括与局部变量交互的指令

--- 程序流程控制指令

--- 对象操作指令,包括方法调用指令

--- 算数运算以及类型转换指令

--- 此外还有一些执行专门任务的指令,比如同步(synchronization)指令,以及抛出异常相关的指令等等。

生成字节码

1、javac xxx.java 将java文件编译成class文件

2、javap -c xxx.class(或者xxx) 反编译class文件,获取字节码清单

3、java中,如果不定义任何构造参数,就会有一个默认的无参构造函数。编译后的class文件证实了其中存在默认构造函数。

4、javap -c verbose xxx(指定 -verbose选项,会输入附加信息),java中每个构造函数中都会先调用super类的构造函数。(无参构造函数编译后存在以下指令)

5、Constant pool:常量池就是一个常量的大字典,使用编号的方式把程序里用到的各类常量统一管理起来,这样在字节码操作中,只需要引用编号即可。

查看方法的信息:descriptor: ([Ljava/lang/String;)V

。其中小括号内是入参信息形参信息

。左方括号表示数组

。L表示对象

。后面的 java/lang/String就是类名称

。小括号后面的v则表示这个方法的返回值是void

。方法的访问标志也很容易理解flags: ACC_PUBLIC, ACC_STATIC,表示public和static

。stack=2, locals=2, args_size=1分别表示栈stack深度,局部变量表中保留的槽位数,方法的参数个数

线程栈与字节码执行模型

jvm是一台基于栈的计算机器,每个线程都有一个独属于自己的线程栈(JVM stack),用于存储栈帧(Frame)。每一次方法调用,jvm都会自动创建一个栈帧。栈帧由操作数栈,局部变量数组,一个class引用组成。class引用指向当前方法在运行时常量池中对应的class。

局部变量数组(局部变量表LocalVariableTable):包含了方法的参数以及局部变量。局部变量表的大小在编译的时候就已经确定了。和局部变量表+形参的个数有关,还有每个变量/参数占用多少个字节。

操作数栈:是一个LIFO结构的栈,用于压栈和弹出值,它的大小也在编译的时候确定。有一些指令可以压栈或者从栈中取值操作,还有一些可以接受调用其他方法返回的结果值。

对象初始化指令

当看倒new ,dup , invokespecial指令在一起的时候,那么一定是在创建类的实例对象。

new: 指令只是创建对象,但是没有调用构造方法。

invokespecial: 指令用来调用某些特殊方法的,当然这里调用的是构造函数。

dup: 指令用来复制栈顶的值。由于构造函数调用不会返回值,所以如果没有dup指令,在对象上调用方法并初始化之后,操作数栈就会是空的,在初始化之后就会出现问题,接下来的代码就无法对其进行处理。这就是为什么要事先复制引用的原因,为的是在构造函数返回之后,可以将对象实例 赋值给局部变量或某个字段。因此,接下来的那条指令一般是以下几种: astore {N} or astore_{N} – 赋值给局部变量,其中 {N} 是局部变量表中 的位置。 putfield – 将值赋给实例字段 putstatic – 将值赋给静态字段 在调用构造函数的时候,其实还会执行另一个类似的方法 ,甚至在执行构 造函数之前就执行了。 还有一个可能执行的方法是该类的静态初始化方法 , 但 并不 能被直接调用,而是由这些指令触发的: new , getstatic , putstatic or invokestatic 。 4.8 对象初始化指令:new指令, init 以及 clinit 简介 0: new #2 // class demo/jvm0104/HelloByteCode 3: dup 4: invokespecial #3 // Method "":()V 1 2 3 也就是说,如果创建某个类的新实例, 访问静态字段或者调用静态方法,就会触发该 类的静态初始化方法【如果尚未初始化】。

栈内存操作指令

dup 指令复制栈顶元素的值。 pop 指令则从栈中删除最顶部的值。

swap 指令可交换栈顶两个元素的值;

dup_x1 将复制栈顶元素的值,并在栈顶插入两次;

dup2_x1 则复制栈顶两个元素的值,并插入第三个值。

局部变量表

待学习

流程控制指令

待学习

算术运算指令与类型转换指令

待学习

方法调用指令和参数传递

待学习

JDK1.7新增方法调用指令invokedynamic

待学习

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

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

相关文章

MySQL 身份认证漏洞 CVE-2012-2122

漏洞影响版本 MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not.MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.演示 开启靶场 进入漏洞目录 cd /root/vulhub/mysql/CVE-2012-2122开启漏洞靶场 docker-compose up -d攻击 直接 运行 这个命令 for i i…

基于SSM+Vue的物流管理系统

运行截图 获取方式 Gitee仓库

Linux开发--Linux内核开发移植

Linux内核开发移植 Linux内核版本变迁及其获得 Linux是最受欢迎的自由电脑操作系统内核, 是一个用C语言写成, 并且符合POSIX标准的类Unix操作系统 Linux是由芬兰黑客Linus Torvalds开发的, 目的是尝试在英特尔x86架构上提供自由免费的类Un…

旅游推荐管理系统(小组项目)

文章目录 前言 一、项目介绍 1. 项目目的 2. 项目意义 2.1 提升旅游体验 2.2 促进旅游业发展 2.3 数据积累与分析 2.4 提升服务品质 2.5 优化资源配置 二、项目结构 1. 主要使用的技术 1.1 若依(Ruoyi)框架 1.2 Vue.js框架 1.3 Ajax 1.4 …

RS2227XN功能和参数介绍及PDF资料

RS2227XN是一款模拟开关/多路复用器 品牌: RUNIC(润石) 封装: MSOP-10 描述: USB2.0高速模拟开关 开关电路: 双刀双掷(DPDT) 通道数: 2 工作电压: 1.8V~5.5V 导通电阻(RonVCC): 10Ω 功能:模拟开关/多路复用器 USB2.0高速模拟开关 工作电压范围:1.8V ~ 5…

leetcode刷题指南

本文我将分享给大家一套我自己使用良久并觉得非常高效的 学习论,它可以运用到 Leetcode 上的刷题,也可以 generalize 到生活中涉及到学习以及记忆的方方面面。当然,本文将以 Leetcode 刷题为 case study 去进行讲解。 更具体一点, 我会教大家…

WEB后端复习——JSP、EL、JSTL

JSP:Java Serve Pages(Java服务器页面) 运行在服务器的脚本、在静态网页HTML代码中嵌入java 优势特点 1.被编译后可以多次直接运行,代码执行效率高(一次加载、多次可用) 2.动态代码封装,组件可重用性高(JavaBean EJ…

Linux安装配置CGAL,OpenCV和Gurobi记录

安装Qt,查看当前的Qt版本,需要至少满足v5.12 qmake -v安装CGAL,The Computational Geometry Algorithms Library (cgal.org) CGAL v5.6.1:https://github.com/CGAL/cgal/releases/download/v5.6.1/CGAL-5.6.1.tar.xz 确保C编译…

图鸟UI vue3:基于Vue3和UniApp的酷炫简洁UI框架

引言 随着前端技术的不断发展,开发效率和用户体验成为了前端开发中的两大关键因素。为了提高开发效率和提供更好的用户体验,各种UI框架应运而生。其中,TuniaoUI作为一款基于Vue3和UniApp开发的UI组件库,以其酷炫简洁的设计和丰富…

厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中

一、写在开头 我们在上一篇文章中提到了通过EasyExcel处理Mysql百万数据的导入功能(一键看原文),当时我们经过测试数据的反复测验,100万条放在excel中的数据,4个字段的情况下,导入数据库,平均耗…

【计算机毕业设计】基于微信小程序的校园综合服务

随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,校园综合服务被用户普遍使用,为方便用户能够可以随时…

李飞飞首次创业!

B站:啥都会一点的研究生公众号:啥都会一点的研究生 最近AI又有啥进展?一起看看吧~ 中国独角兽企业已达369家,六成以上与AI、芯片等硬科技赛道有关 2024中关村论坛“全球独角兽企业大会”上发布全新《中国独角兽企业发展报告&am…

win10建立共享文件夹和ipad共享文件

win10端设置 查看自己的局域网IP 在任意地方新建一个文件夹 打开文件夹的属性,点到共享的地方 点击高级共享 然后点击应用,确认 再回到之前哪个地方,点击共享 把Everyone的权限改为读取/写入 最后点击共享就欧克了 失败的可能原因 ipad端设置 然后回出现一个要输入用户名和…

【Python项目】基于大数据的【电影市场预测分析】

技术简介:使用Python技术、B/S架构、MYSQL数据库等实现。 系统简介:系统都需要简单的安全登陆检查,在登陆成功之后要进行在映电影的分析、票房分析、电影数据等功能相关性的数据统计,为了使用方便这些统计型的数据使用图表来进行表…

微信公众号接入chatGPT自动回复(2)

微信公众平台 配置自动回复的服务器 application.properties中的配置 验证服务器接口配置 其实就两个接口(相同的url地址,只不过请求方式不一样) 1.验证接口(get请求) 2.自动回复接口(post请求) 完整代码 这个地址就是上面URL配置的地址 如果使用Nginx的话自动配置 将该代…

根据蛋白质序列,计算其分子量(molecular weight),在线工具,原理和python代码

蛋白质分子量 蛋白质是由许多氨基酸残基通过肽键(一个氨基酸的 α-羧基与另一个氨基酸的 α-氨基脱水缩合形成的化学键)连接而成。蛋白质的分子量(molecular weight)为各个氨基酸的分子量之和,是蛋白质的重要理化参数…

sqli-labs靶场第十四关

目录 1:分析 找闭合符: 2:开始注入 报错注入: 注入数据库名: 注入表名: 注入列名: 注入具体值: 1:分析 经过我们的实验发现当我们输入的密码后面存在双引号时会报…

[数据结构]动画详解单链表

💖💖💖欢迎来到我的博客,我是anmory💖💖💖 又和大家见面了 欢迎来到动画详解数据结构系列 用通俗易懂的动画的动画使数据结构可视化 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低…

数据分析的统计推断

数据分析的统计推断 前言一、提出问题二、统计归纳方法三、统计推断四、统计推断步骤如何进行统计推断统计推断的基本问题点估计区间估计总体方差已知总体方差未知 假设检验假设检验的假设显著性水平 五、检验统计量常见的检验统计量 六、检验方法七、拒绝域八、假设检验步骤九…

嵌入式C语言高级教程:实现基于STM32的环境监测系统

⬇帮大家整理了单片机的资料 包括stm32的项目合集【源码开发文档】 点击下方蓝字即可领取,感谢支持!⬇ 点击领取更多嵌入式详细资料 问题讨论,stm32的资料领取可以私信! 环境监测系统通过实时收集和分析环境数据,如温度…