字节码基础

基本概念

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

待学习

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

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

相关文章

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 布局管理器 | 水平布局Horizontal Layout 文章编号&…

leetcode刷题:买卖股票的最佳时机

题目 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大…

Java基于Geth1.8实现节点同步、合约部署,以及踩坑记录—主节点控制台卡死、节点同步出错的解决方案

前言:本文将从一个区块链入门小白的视角,来一步步的讲解如何实现区块链数据上链,链上数据查询,geth多节点同步。以及讲解在上链过程中,我踩过的坑及其解决方案。如果有不对的地方,还请大佬指教!…

2023愚人杯 )————被遗忘的反序列化

<?php# 当前目录中有一个txt文件哦 error_reporting(0); show_source(__FILE__); include("check.php");class EeE{public $text;public $eeee;public function __wakeup(){if ($this->text "aaaa"){echo lcfirst($this->text);}}public functi…

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

运行截图 获取方式 Gitee仓库

用迭代加深解决加成序列问题

可以看到这个最坏的结果是100层搜索&#xff0c;但是其实1 2 4 8 16 32 64 128&#xff0c;到128的话也只要8&#xff0c;所以大概只需要10几层搜索就可以解决了&#xff0c;这个时候就可以用迭代加深的方法&#xff0c;深度一点点的加&#xff0c;如果大于概深度就舍去。有人说…

解决vue3项目打包后部署后某些静态资源图片不加载问题

目录 问题 原因 解决方案 问题 开发完项目打包并部署 然后访问时发现导航栏背景图片没加载 打开浏览器控制台发现这张图片报错404 原因 可能是因为在部署后的服务器环境中对中文文件名的支持不完善。服务器在解析 URL 时可能无法正确识别或编码中文字符&#xff0c;导致无…

实现stract(字符串拼接)函数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;char a[80], b[80];int i, n1, n2;//填充字符串&#xff1b;printf("请输入字符串a的内…

Shell编程之循环语句之for

一.for循环语句 读取不同的变量值&#xff0c;用来逐个执行同一组命令 for 变量名 in 取值列表 do命令序列 done 示例&#xff1a; 1.计算从1到100所有整数的和 2.提示用户输入一个小于100的整数&#xff0c;并计算从1到该数之间所有整数的和 3.求从1到100所有整数的偶数和…

【计算机网络】计算机网络体系结构

&#x1f6a9;本文已收录至专栏&#xff1a;计算机网络学习之旅 一.常见的三种结构 (1) OSI参考模型 为了使不同体系结构的计算机网络都能互连起来&#xff0c;国际标准化组织于1977年成立了专门机构研究该问题&#xff0c;提出了著名的开放系统互连基本参考模型&#xff0c…

若依-生成主子表

1. sql语句建表导入到数据库中&#xff1a; -- ---------------------------- -- Table structure for t_ques————主表 -- ----------------------------CREATE TABLE ques (ques_id INT NOT NULL AUTO_INCREMENT COMMENT Id,name VARCHAR(255) NOT NULL COMMENT 测评名称…

IB 公式解析

公式 3.2. Influence Function 影响函数允许我们在移除样本时估计模型参数的变化&#xff0c;而无需实际移除数据并重新训练模型。 3.3 影响平衡加权因子 3.4 影响平衡损失 3.5 类内重加权 m代表一个批次&#xff08;batch&#xff09;的大小&#xff0c;这意味着公式对一个批…

【Dash】开始学习dash

安装Dash 网上很多安装dash的教程&#xff0c;不再赘述 开始Dash 一个dash页面的基本写法 # dash 的基本写法 import dash from dash import html,dcc,callback,Input,Output# 创建一个 dash 应用 app dash.Dash()# 定义布局&#xff0c;定义一个输入框和一个输出框 app.l…

电商技术揭秘营销相关系列文章合集(4)

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 文章目录 引言集合说明集合文章列表 引言 在数字化浪潮的推动下&#xff0c;电商行…

windows窗口消息队列与消息过程处理函数

在Windows窗口应用程序中&#xff0c;消息队列和窗口过程函数是实现消息驱动机制的核心组件。 消息队列&#xff08;Message Queue&#xff09;&#xff1a; 消息队列是用于存储窗口消息的缓冲区。当用户与应用程序交互时&#xff0c;系统会将生成的消息插入到消息队列中&…

手游掘金最新玩法,单条视频变现1w+,一部手机即可操作,保姆级教程

如果你也想通过手机赚钱&#xff0c;在这里有一个非常好的项目&#xff0c;它可以让你轻松赚到额外的收入。 这个手游掘金最新玩法&#xff0c;是一个非常受欢迎的项目&#xff0c;它可以让你通过制作单条视频来获得高额收益。不同于传统的游戏赚钱方式&#xff0c;这个方法不…

哈希(构造哈希函数)

哈希 哈希也可以叫散列 画一个哈希表 哈希冲突越多&#xff0c;哈希表效率越低。 闭散列开放定址法: 1.线性探测&#xff0c;依次往后去找下一个空位置。 2.二次探测&#xff0c;按2次方往后找空位置。 #pragma once #include<vector> #include<iostream> #i…

告别数据泥潭:PySpark性能调优的黄金法则

阿佑今天给大家带来个一张藏宝图——使用PySpark进行性能调优的黄金法则&#xff0c;从内存管理到执行计划&#xff0c;再到并行度设置&#xff0c;每一步都是提升数据处理速度的关键&#xff01; 文章目录 Python Spark 详解1. 引言2. 背景介绍2.1 大数据处理技术演变2.2 Apac…

【MySQL】SQL基本知识点DML(2)

目录 1.DML添加数据 2.DML-修改数据 &#xff08;1&#xff09;改​编辑 &#xff08;2&#xff09;删​编辑​编辑 3.DQL-基本查询 &#xff08;1&#xff09;查询多个字段​编辑​编辑​编辑 &#xff08;2&#xff09;设置别名 &#xff08;3&#xff09;去重操作 4…

月内录用,这本期刊不到2个月完成检索

无预警毕业/晋升快刊&#xff0c;该期刊2008年被WOS收录&#xff0c;现已稳定检索16年&#xff0c;进展超顺。注意&#xff01;该期刊仅剩10篇版面&#xff01;咨询Aaron编辑老师了解该刊更多信息&#xff01; 1、期刊基本信息 【期刊简介】IF&#xff1a;0-1.0&#xff0c;J…