字节码基础

基本概念

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指令,在对象上调用方法并初始化之后,操作数栈就会是空的,在初始化之后就会出现问题,接下来的代码就无法对其进行处理。这就是为什么要事先复制引用的原因,为的是在构造函数返回之后,可以将对象实例 赋值给局部变量或某个字段。

栈内存操作指令

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

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

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

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

局部变量表

待学习

流程控制指令

待学习

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

待学习

方法调用指令和参数传递

待学习

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

待学习

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

指针的奥秘(四):回调函数+qsort使用+qsort模拟实现冒泡排序

指针 一.回调函数是什么?二.qsort函数使用1.qsort介绍2.qsort排序整型数据3.qsort排序结构体数据1.通过结构体中的整形成员排序2.通过结构体中的字符串成员排序 三.qsort模拟实现冒泡排序 一.回调函数是什么? 回调函数就是一个通过函数指针调用的函数。 …

华为机试打卡 HJ2 计算某字符出现次数

要机试了,华孝子求捞,功德 描述 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母) 数据范围: 1≤&a…

47.乐理基础-音符的组合方式-连线

连线与延音线长得一模一样 它们的区别就是延音线的第三点,延音线必须连接相同的音 连线在百分之九十九的情况下,连接的是不同的音,如下图的对比,连线里的百分之1,以现在的知识无法理解,后续再写 在乐谱中遇…

Linux提权--定时任务--打包配合 SUID(本地)文件权限配置不当(WEB+本地)

免责声明:本文仅做技术交流与学习... 目录 定时任务 打包配合 SUID-本地 原理: 背景: 操作演示: 分析: 实战发现: 定时任务 文件权限配置不当-WEB&本地 操作演示: 定时任务 打包配合 SUID-本地 原理: 提权通过获取计划任务执行文件信息进行提权 . 1、相对路径和…

Linux常见指令2️⃣

目录 cp指令(重要) mv指令(重要) cat、tac head、tail指令(重要) 知识点 时间相关的指令 知识点: Cal指令 grep 指令 zip/unzip指令 知识点 cp指令(重要) 语法…

K-CU12和利时工控单元

K-CU12和利时工控单元。控制策略组态,使用专用的组态软件 人机界面HMI设计:操作员站画面设计,使用专用的组态软件 K-CU12和利时工控单元文件组态 2文档管理软件 在工程师站上进行系统组态的主要工作: K-CU12和利时工控单元。系统配…

1067: 有向图的邻接表存储强连通判断

解法&#xff1a; 定理&#xff1a;有向图G是强连通图的充分必要条件是G中存在一条经过所有节点的回路 跟上道题一样 这是错误代码 #include<iostream> #include<vector> using namespace std; int arr[100][100]; void dfs(vector<bool>& a,int u) {a…

数据分析的统计推断

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

如何使用活字格批量导入照片到数据表

活字格是一款功能强大的电子表格软件&#xff0c;除了基本的表格计算功能之外&#xff0c;还提供了丰富的扩展功能&#xff0c;可以用来实现各种自动化操作。例如&#xff0c;我们可以使用活字格来批量导入照片到数据表中。 以下是具体的操作步骤&#xff1a; 在活字格工作表…

离线修复.dll,Microsoft Visual C++

在安装mysql时遇到下面的问题&#xff0c;如果是有网络的情况下微软管网下载安装就行了&#xff0c;用的服务器不允许连接互联网。 后面经过寻找&#xff0c;找到了一个修复工具&#xff0c;可一次修复所有的问题&#xff0c;特别好用分享给宝子们。 下载链接&#xff1a;http…

SM935,SM942,SM150和利时备件

SM935,SM942,SM150和利时备件。组态软件&#xff0c;可组态控制图、机柜布置图、电源分配图等&#xff0c;可编辑、编译、SM935,SM942,SM150和利时备件。工程师站组态的基本步骤&#xff1a;SM935,SM942,SM150和利时备件。 1. 根据生产现场的控制方案画出控制系统原理图 2. 根据…

Request请求数据 (** kwargs参数)

这里写目录标题 &#x1f31f;前言&#x1f349;request入门1. params2. data3. json4. headers5. cookies6. auth7. files8. timeout9. proxies10. allow_redirects11. stream12. verify13. cert &#x1f31f;总结 &#x1f31f;前言 在Python中&#xff0c;发送网络请求是一…

设计模式——结构型模式——代理模式(静态代理、动态代理:JDK、CGLIB)

目录 代理模式 代理模式简介 代理模式的分类 代理模式组成 代理模式的优缺点 静态代理 背景前置 编写代码 JDK动态代理 编写代码 使用Arthas分析JDK动态代理底层原理 CGLIB动态代理 编写代码 三种代理的对比 代理模式使用场景 代理模式 代理模式简介 代理模式属…

数据可视化第五天(读取文件获得男生女生身高信息,并且可视化在一个图像)

文件 需要学生文件的可以私信我 过程 利用numpy的loadtxt文件读取学号&#xff0c;性别&#xff0c;和身高。 import numpy as np import matplotlib.pyplot as pltfilename/Users/oommnn/Desktop/python学习/数据分析/网课资料/第04天/student-data.txtuser_infonp.dtype(…

智慧公厕:数据驱动的公共厕所智慧化管理

公共厕所作为城市基础设施的重要组成部分&#xff0c;对于城市居民的生活质量和城市形象有着不可忽视的影响。然而&#xff0c;传统的公共厕所管理模式存在诸多问题&#xff0c;如设施老化、卫生状况不佳等&#xff0c;严重限制了公众对于公共厕所的使用体验。随着大数据和智能…

EDA设计学习笔记2:STM32F103C8T6最小系统板的仿绘

今日开始仿制练习一个STM32F103C8T6最小系统板&#xff0c;通过对这个最小系统板的仿制&#xff0c;达到对自己PCB设计的练习的目的&#xff0c;最终目标是自己设计出一块PCB&#xff0c;做一个OLED的桌面小摆件...... 也不知道画出来能不能用..... 目录 主控芯片的搜索与放置…

proteus示波器不弹出来

运行后示波器没有弹出来 点击调试&#xff08;Debug&#xff09;在点击Digital Oscilloscope 完成

SamFirm Reborn 0.3.6.8三星固件下载器 汉化版

介绍 在三星手机的维护和升级过程中&#xff0c;固件的获取往往成为了一个难题。幸运的是&#xff0c;有一群热爱技术的开发者们&#xff0c;他们开发了各种工具以简化这个过程。今天&#xff0c;我们要介绍的是一款名为SamFirm Reborn 0.3.6.8的三星固件下载器的汉化版。它旨在…

目前公认的一些好用AI工具

ChatGPT&#xff1a;这是一个广泛推荐和使用的AI聊天机器人&#xff0c;能够进行高效的文本生成和对话管理。它在多个证据中被提及&#xff0c;显示其普遍性和实用性。 Midjourney&#xff1a;这是一款强大的AI绘画工具&#xff0c;特别适合创意写作和图像生成。它在多个来源中…

mysql中的页和行

页 行即表中的真实行&#xff0c;‘行式数据库’的由来 虽然MySQL的数据文件&#xff08;例如.ibd文件&#xff09;中的数据页在物理上是通过链表连接的&#xff0c;但是在逻辑上&#xff0c;MySQL使用B树来组织和访问数据。 行&#xff1a;主要是dynamic类型