Java JVM虚拟机

加载字节码文件.class

1字节一般为8位

字节码结构:

第一部分 4字节 cafebaby 第二部分 版本号 00 00 00 32,

第三部分 常量数量 count

第四部分常量池 

常量类型表示:

继承关系改变 1.1以后

后面是属性方法 等参数

通过javap 反编译class ,javap xx.class

javap -c xxx.class 

javap -v xx.class

常量池 29-1

( ) V 表示返回值viod

stack 操作数栈,如果相加,两个数入栈 然后add

locals  本地变量表 存放结果

args_size  = x 参数数量,0位表示this,如果只有一个参数,则size = 3,double 占用两个, this 占用1个

栈的空间大小slot

字节一般是0-255

...

字节码助记符指令含义
0x00nopNone
0x01aconst_null将null推送至栈顶
0x02iconst_m1将int型-1推送至栈顶
0x03iconst_0将int型0推送至栈顶
0x04iconst_1将int型1推送至栈顶
0x05iconst_2将int型2推送至栈顶
0x06iconst_3将int型3推送至栈顶
0x07iconst_4将int型4推送至栈顶
0x08iconst_5将int型5推送至栈顶
0x09lconst_0将long型0推送至栈顶
0x0alconst_1将long型1推送至栈顶
0x0bfconst_0将float型0推送至栈顶
0x0cfconst_1将float型1推送至栈顶
0x0dfconst_2将float型2推送至栈顶
0x0edconst_0将double型0推送至栈顶
0x0fdconst_1将double型1推送至栈顶
0x10bipush将单字节的常量值(-128~127)推送至栈顶
0x11sipush将一个短整型常量(-32768~32767)推送至栈顶
0x12ldc将int,float或String型常量值从常量池中推送至栈顶
0x13ldc_w将int,float或String型常量值从常量池中推送至栈顶(宽索引)
0x14ldc2_w将long或double型常量值从常量池中推送至栈顶(宽索引)
0x15iload将指定的int型本地变量推送至栈顶
0x16lload将指定的long型本地变量推送至栈顶
0x17fload将指定的float型本地变量推送至栈顶
0x18dload将指定的double型本地变量推送至栈顶
0x19aload将指定的引用类型本地变量推送至栈顶
0x1aiload_0将第一个int型本地变量推送至栈顶
0x1biload_1将第二个int型本地变量推送至栈顶
0x1ciload_2将第三个int型本地变量推送至栈顶
0x1diload_3将第四个int型本地变量推送至栈顶
0x1elload_0将第一个long型本地变量推送至栈顶
0x1flload_1将第二个long型本地变量推送至栈顶
0x20lload_2将第三个long型本地变量推送至栈顶
0x21lload_3将第四个long型本地变量推送至栈顶
0x22fload_0将第一个float型本地变量推送至栈顶
0x23fload_1将第二个float型本地变量推送至栈顶
0x24fload_2将第三个float型本地变量推送至栈顶
0x25fload_3将第四个float型本地变量推送至栈顶
0x26dload_0将第一个double型本地变量推送至栈顶
0x27dload_1将第二个double型本地变量推送至栈顶
0x28dload_2将第三个double型本地变量推送至栈顶
0x29dload_3将第四个double型本地变量推送至栈顶
0x2aaload_0将第一个引用类型本地变量推送至栈顶
0x2baload_1将第二个引用类型本地变量推送至栈顶
0x2caload_2将第三个引用类型本地变量推送至栈顶
0x2daload_3将第四个引用类型本地变量推送至栈顶
0x2eiaload将int型数组指定索引的值推送至栈顶
0x2flaload将long型数组指定索引的值推送至栈顶
0x30faload将float型数组指定索引的值推送至栈顶
0x31daload将double型数组指定索引的值推送至栈顶
0x32aaload将引用类型数组指定索引的值推送至栈顶
0x33baload将boolean或byte型数组指定索引的值推送至栈顶
0x34caload将char型数组指定索引的值推送至栈顶
0x35saload将short型数组指定索引的值推送至栈顶
0x36istore将栈顶int型数值存入指定本地变量
0x37lstore将栈顶long型数值存入指定本地变量
0x38fstore将栈顶float型数值存入指定本地变量
0x39dstore将栈顶double型数值存入指定本地变量
0x3aastore将栈顶引用类型数值存入指定本地变量
0x3bistore_0将栈顶int型数值存入第一个本地变量
0x3cistore_1将栈顶int型数值存入第二个本地变量
0x3distore_2将栈顶int型数值存入第三个本地变量
0x3eistore_3将栈顶int型数值存入第四个本地变量
0x3flstore_0将栈顶long型数值存入第一个本地变量
0x40lstore_1将栈顶long型数值存入第二个本地变量
0x41lstore_2将栈顶long型数值存入第三个本地变量
0x42lstore_3将栈顶long型数值存入第四个本地变量
0x43fstore_0将栈顶float型数值存入第一个本地变量
0x44fstore_1将栈顶float型数值存入第二个本地变量
0x45fstore_2将栈顶float型数值存入第三个本地变量
0x46fstore_3将栈顶float型数值存入第四个本地变量
0x47dstore_0将栈顶double型数值存入第一个本地变量
0x48dstore_1将栈顶double型数值存入第二个本地变量
0x49dstore_2将栈顶double型数值存入第三个本地变量
0x4adstore_3将栈顶double型数值存入第四个本地变量
0x4bastore_0将栈顶引用型数值存入第一个本地变量
0x4castore_1将栈顶引用型数值存入第二个本地变量
0x4dastore_2将栈顶引用型数值存入第三个本地变量
0x4eastore_3将栈顶引用型数值存入第四个本地变量
0x4fiastore将栈顶int型数值存入指定数组的指定索引位置
0x50lastore将栈顶long型数值存入指定数组的指定索引位置
0x51fastore将栈顶float型数值存入指定数组的指定索引位置
0x52dastore将栈顶double型数值存入指定数组的指定索引位置
0x53aastore将栈顶引用型数值存入指定数组的指定索引位置
0x54bastore将栈顶boolean或byte型数值存入指定数组的指定索引位置
0x55castore将栈顶char型数值存入指定数组的指定索引位置
0x56sastore将栈顶short型数值存入指定数组的指定索引位置
0x57pop将栈顶数值弹出(数值不能是long或double类型的)
0x58pop2将栈顶的一个(对于非long或double类型)或两个数值(对于非long或double的其他类型)弹出
0x59dup复制栈顶数值并将复制值压入栈顶
0x5adup_x1复制栈顶数值并将两个复制值压入栈顶
0x5bdup_x2复制栈顶数值并将三个(或两个)复制值压入栈顶
0x5cdup2复制栈顶一个(对于long或double类型)或两个(对于非long或double的其他类型)数值并将复制值压入栈顶
0x5ddup2_x1dup_x1指令的双倍版本
0x5edup2_x2dup_x2指令的双倍版本
0x5fswap将栈顶最顶端的两个数值互换(数值不能是long或double类型)
0x60iadd将栈顶两int型数值相加并将结果压入栈顶
0x61ladd将栈顶两long型数值相加并将结果压入栈顶
0x62fadd将栈顶两float型数值相加并将结果压入栈顶
0x63dadd将栈顶两double型数值相加并将结果压入栈顶
0x64isub将栈顶两int型数值相减并将结果压入栈顶
0x65lsub将栈顶两long型数值相减并将结果压入栈顶
0x66fsub将栈顶两float型数值相减并将结果压入栈顶
0x67dsub将栈顶两double型数值相减并将结果压入栈顶
0x68imul将栈顶两int型数值相乘并将结果压入栈顶
0x69lmul将栈顶两long型数值相乘并将结果压入栈顶
0x6afmul将栈顶两float型数值相乘并将结果压入栈顶
0x6bdmul将栈顶两double型数值相乘并将结果压入栈顶
0x6cidiv将栈顶两int型数值相除并将结果压入栈顶
0x6dldiv将栈顶两long型数值相除并将结果压入栈顶
0x6efdiv将栈顶两float型数值相除并将结果压入栈顶
0x6fddiv将栈顶两double型数值相除并将结果压入栈顶
0x70irem将栈顶两int型数值作取模运算并将结果压入栈顶
0x71lrem将栈顶两long型数值作取模运算并将结果压入栈顶
0x72frem将栈顶两float型数值作取模运算并将结果压入栈顶
0x73drem将栈顶两double型数值作取模运算并将结果压入栈顶
0x74ineg将栈顶int型数值取负并将结果压入栈顶
0x75lneg将栈顶long型数值取负并将结果压入栈顶
0x76fneg将栈顶float型数值取负并将结果压入栈顶
0x77dneg将栈顶double型数值取负并将结果压入栈顶
0x78ishl将int型数值左移指定位数并将结果压入栈顶
0x79lshl将long型数值左移指定位数并将结果压入栈顶
0x7aishr将int型数值右(带符号)移指定位数并将结果压入栈顶
0x7blshr将long型数值右(带符号)移指定位数并将结果压入栈顶
0x7ciushr将int型数值右(无符号)移指定位数并将结果压入栈顶
0x7dlushr将long型数值右(无符号)移指定位数并将结果压入栈顶
0x7eiand将栈顶两int型数值"按位与"并将结果压入栈顶
0x7fland将栈顶两long型数值"按位与"并将结果压入栈顶
0x80ior将栈顶两int型数值"按位或"并将结果压入栈顶
0x81lor将栈顶两long型数值"按位或"并将结果压入栈顶
0x82ixor将栈顶两int型数值"按位异或"并将结果压入栈顶
0x83lxor将栈顶两long型数值"按位异或"并将结果压入栈顶
0x84iinc将指定int型变量增加指定值(如i++, i--, i+=2等)
0x85i2l将栈顶int型数值强制转换为long型数值并将结果压入栈顶
0x86i2f将栈顶int型数值强制转换为float型数值并将结果压入栈顶
0x87i2d将栈顶int型数值强制转换为double型数值并将结果压入栈顶
0x88l2i将栈顶long型数值强制转换为int型数值并将结果压入栈顶
0x89l2f将栈顶long型数值强制转换为float型数值并将结果压入栈顶
0x8al2d将栈顶long型数值强制转换为double型数值并将结果压入栈顶
0x8bf2i将栈顶float型数值强制转换为int型数值并将结果压入栈顶
0x8cf2l将栈顶float型数值强制转换为long型数值并将结果压入栈顶
0x8df2d将栈顶float型数值强制转换为double型数值并将结果压入栈顶
0x8ed2i将栈顶double型数值强制转换为int型数值并将结果压入栈顶
0x8fd2l将栈顶double型数值强制转换为long型数值并将结果压入栈顶
0x90d2f将栈顶double型数值强制转换为float型数值并将结果压入栈顶
0x91i2b将栈顶int型数值强制转换为byte型数值并将结果压入栈顶
0x92i2c将栈顶int型数值强制转换为char型数值并将结果压入栈顶
0x93i2s将栈顶int型数值强制转换为short型数值并将结果压入栈顶
0x94lcmp比较栈顶两long型数值大小, 并将结果(1, 0或-1)压入栈顶
0x95fcmpl比较栈顶两float型数值大小, 并将结果(1, 0或-1)压入栈顶; 当其中一个数值为NaN时, 将-1压入栈顶
0x96fcmpg比较栈顶两float型数值大小, 并将结果(1, 0或-1)压入栈顶; 当其中一个数值为NaN时, 将1压入栈顶
0x97dcmpl比较栈顶两double型数值大小, 并将结果(1, 0或-1)压入栈顶; 当其中一个数值为NaN时, 将-1压入栈顶
0x98dcmpg比较栈顶两double型数值大小, 并将结果(1, 0或-1)压入栈顶; 当其中一个数值为NaN时, 将1压入栈顶
0x99ifeq当栈顶int型数值等于0时跳转
0x9aifne当栈顶int型数值不等于0时跳转
0x9biflt当栈顶int型数值小于0时跳转
0x9cifge当栈顶int型数值大于等于0时跳转
0x9difgt当栈顶int型数值大于0时跳转
0x9eifle当栈顶int型数值小于等于0时跳转
0x9fif_icmpeq比较栈顶两int型数值大小, 当结果等于0时跳转
0xa0if_icmpne比较栈顶两int型数值大小, 当结果不等于0时跳转
0xa1if_icmplt比较栈顶两int型数值大小, 当结果小于0时跳转
0xa2if_icmpge比较栈顶两int型数值大小, 当结果大于等于0时跳转
0xa3if_icmpgt比较栈顶两int型数值大小, 当结果大于0时跳转
0xa4if_icmple比较栈顶两int型数值大小, 当结果小于等于0时跳转
0xa5if_acmpeq比较栈顶两引用型数值, 当结果相等时跳转
0xa6if_acmpne比较栈顶两引用型数值, 当结果不相等时跳转
0xa7goto无条件跳转
0xa8jsr跳转至指定的16位offset位置, 并将jsr的下一条指令地址压入栈顶
0xa9ret返回至本地变量指定的index的指令位置(一般与jsr或jsr_w联合使用)
0xaatableswitch用于switch条件跳转, case值连续(可变长度指令)
0xablookupswitch用于switch条件跳转, case值不连续(可变长度指令)
0xacireturn从当前方法返回int
0xadlreturn从当前方法返回long
0xaefreturn从当前方法返回float
0xafdreturn从当前方法返回double
0xb0areturn从当前方法返回对象引用
0xb1return从当前方法返回void
0xb2getstatic获取指定类的静态域, 并将其压入栈顶
0xb3putstatic为指定类的静态域赋值
0xb4getfield获取指定类的实例域, 并将其压入栈顶
0xb5putfield为指定类的实例域赋值
0xb6invokevirtual调用实例方法
0xb7invokespecial调用超类构建方法, 实例初始化方法, 私有方法
0xb8invokestatic调用静态方法
0xb9invokeinterface调用接口方法
0xbainvokedynamic调用动态方法
0xbbnew创建一个对象, 并将其引用引用值压入栈顶
0xbcnewarray创建一个指定的原始类型(如int, float, char等)的数组, 并将其引用值压入栈顶
0xbdanewarray创建一个引用型(如类, 接口, 数组)的数组, 并将其引用值压入栈顶
0xbearraylength获取数组的长度值并压入栈顶
0xbfathrow将栈顶的异常抛出
0xc0checkcast检验类型转换, 检验未通过将抛出 ClassCastException
0xc1instanceof检验对象是否是指定类的实际, 如果是将1压入栈顶, 否则将0压入栈顶
0xc2monitorenter获得对象的锁, 用于同步方法或同步块
0xc3monitorexit释放对象的锁, 用于同步方法或同步块
0xc4wide扩展本地变量的宽度
0xc5multianewarray创建指定类型和指定维度的多维数组(执行该指令时, 操作栈中必须包含各维度的长度值), 并将其引用压入栈顶
0xc6ifnull为null时跳转
0xc7ifnonnull不为null时跳转
0xc8goto_w无条件跳转(宽索引)
0xc9jsr_w跳转至指定的32位offset位置, 并将jsr_w的下一条指令地址压入栈顶

堆/栈/方法区/常量池

栈会等线程创建时再创建,程序计数器记录偏移量,native则计数器为空

多线程会多个栈

类加载器将class文件加载到方法区

方法区动态连接栈

创建对象,会将对象的引用入栈

dup 复制引用并压入栈顶

指向方法区

无锁状态

根据01和倒数第三位,是0则无锁,如果第三位是1代表lock

1 10代表重量级锁 ,1 00 轻量级锁  

Gc回收 标记清除

缺点,清理后不连续

优化后会移动不清理空间,将空出的进行连续

eden 年轻代

老年代则为标记清除算法

新生代则用父 复制算法

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

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

相关文章

【Redis】springboot整合redis(模拟短信注册)

要保证redis的服务器处于打开状态 上一篇: 基于session的模拟短信注册 https://blog.csdn.net/m0_67930426/article/details/134420531 整个流程是,前端点击获取验证码这个按钮,后端拿到这个请求,通过RandomUtil 工具类的方法生…

.nc格式文件的显示及特殊裁剪方式

最近我们遇到一个nc格式的文件,需要将它做成报告插图,bing搜索一番以后,了解到nc的全名为NetCDF(network Common Data Form),是一种网络通用数据格式,广泛用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。…

【超好用的工具库】hutool-all工具库的基本使用

简介(可不看): hutool-all是一个Java工具库,提供了许多实用的工具类和方法,用于简化Java开发过程中的常见任务。它包含了各种模块,涵盖了字符串操作、日期时间处理、加密解密、文件操作、网络通信、图片处…

指针传2(续集)

近期的天气是真的冷啊,老铁们一定要照顾好自己呀,注意防寒保暖,没有你们我怎么活啊! 上次的指针2的末尾,给大家分享了两个有趣的代码,今天就先来讲一讲那两个代码: 两个有趣的代码:…

Logrotate日志切割工具的应用与配置

Logrotate日志切割工具的应用与配置,以下是公司生产环境亲测,跳了不少的坑,最后已经部署到生产了,可放心使用 简介 Logrotate是一个在Unix和类Unix系统(如Linux)上用于管理日志文件的实用程序。它可以帮助…

官宣定档 | 3大主题论坛重磅行业颁奖,CGT Asia 2024第五届亚洲细胞与基因治疗创新峰会特色亮点抢先看

细胞与基因治疗代表着未来医学发展的趋势,随着技术的不断更新与发展与支持政策的持续推出,细胞与基因治疗产业的希望被无限扩大,自第一批细胞治疗与基因治疗产品上市到如今,行业已经进入快车道,步入高速发展期&#xf…

如何确保消息不会丢失

本篇文章大家还可以通过浏览我的博客阅读。如何确保消息不会丢失 - 胤凯 (oyto.github.io)很多人刚开始接触消息队列的时候&#xff0c;最经常遇到的一个问题就是丢消息了。<!--more-->对于大部分业务来说&#xff0c;丢消息意味着丢数据&#xff0c;是完全无法接受的。 …

C语言--给定一行字符串,获取其中最长单词【图文详解】

一.问题描述 给定一行字符串,获取其中最长单词。 比如&#xff1a;给定一行字符串&#xff1a; hello wo shi xiao xiao su 输出&#xff1a;hello 二.题目分析 “打擂台算法”&#xff0c;具体内容小伙伴们可以参考前面的内容。 三.代码实现 char* MaxWord(const char* str)…

CMakeLists.txt基础指令与cmake-gui生成VS项目的步骤

简介 本博客主要介绍cmake的基本指令&#xff0c;同时&#xff0c;很多使用Visual Studio小白从Gitbub下载项目源码后&#xff0c;看到CMakeLists.txt&#xff0c;不知道如何使用Visual Studio编译源码&#xff1b;针对以上问题&#xff0c;做一下简单操作与解释&#xff0c;方…

c语言-数据结构-堆

目录 一、二叉树 1、二叉树的概念 2、完全二叉树和满二叉树 3、完全二叉树的顺序存储 二、堆 2、堆的概念与结构 3、堆的创建及初始化 4、堆的插入&#xff08;小堆&#xff09; 5、堆的删除 6、显示堆顶元素 7、显示堆里的元素个数 8、测试堆的各个功能 9、 实现堆…

零代码编程:用ChatGPT批量转换多个视频文件夹到音频并自动移动文件夹

有很多个视频文件夹&#xff1a; 要全部转成音频&#xff0c;然后复制到另一个文件夹。 在ChatGPT中输入如下提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个批量将Mp4视频转为Mp3音频的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;…

机器学习 天气识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/Nb93582M_5usednAKp_Jtw) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** >- **&#x1f680;…

matlab层次分析法模型及相关语言基础

发现更多计算机知识&#xff0c;欢迎访问Cr不是铬的个人网站 代码放在最后面! 这篇文章是学习层次分析法模型的笔记。 1.什么时候用层次分析法 层次分析法是建模比赛中最基础的模型之一&#xff0c;其主要用于解决评价类问题&#xff08;例如&#xff1a;选择哪种方案最好、…

Mysql数据库 16.SQL语言 数据库事务

一、数据库事务 数据库事务介绍——要么全部成功要么全部失败 我们把完成特定的业务的多个数据库DML操作步骤称之为一个事务 事务——就是完成同一个业务的多个DML操作 例&#xff1a; 数据库事务四大特性 原子性&#xff08;A&#xff09;&#xff1a;一个事务中的多个D…

ZYNQ7000---FLASH读写

提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Flash是什么&#xff1f;二、Flash的分类1、内部结构&#xff08;接口&#xff09;区分&#xff1a;2、外部接口区分&#xff1a;SPIQPSI Flash: QSPI 控制…

如何做好性能压测 —— 压测环境设计和搭建!

简介&#xff1a;一般来说&#xff0c;保证执行性能压测的环境和生产环境高度一致是执行一次有效性能压测的首要原则。有时候&#xff0c;即便是压测环境和生产环境有很细微的差别&#xff0c;都有可能导致整个压测活动评测出来的结果不准确。 1. 性能环境要考虑的要素 1.1 系…

SMART PLC星三角延时启动功能块(梯形图FC)

这里我们介绍SMART PLC星三角延时启动功能块,SMART PLC的周期定时器功能块请参考下面文章链接: 周期定时器FB_Cycle_time(SCL+梯形图代码)-CSDN博客文章浏览阅读80次。博途PLC定时器指令使用详细介绍请参考下面文章链接:博途PLC IEC定时器编程应用(SCL语言)_scl定时器-CS…

python环境安装教程

1.python解释器安装 python解释器&#xff1a;将书写的代码转换为二进制。 1.打开官网&#xff1a;Welcome to Python.org&#xff0c;点击下载&#xff0c;选择对应的系统和想要下载的python版本进行下载&#xff1a; 2.双击打开下载好的python解释器进行安装&#xff0c;可…

链表(一)----关于单链表的一切细节这里都有

一.链表 1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 现实中的链表结构 数据结构中的链表结构 1.链式结构在逻辑上是连续的&#xff0c;但在物理上不一定是…

开启数据库审计 db,extended级别或os级别)并将审计文件存放到/opt/oracle/audit/下

文章目录 1、登录到数据库2、查看审计状态3、创建审计目录4、启用审计5、设置审计文件路径5、再次查看结果 1、登录到数据库 使用SQL*Plus或者其他Oracle数据库客户端登录到数据库。 sqlplus / as sysdba;2、查看审计状态 show parameter audit;目前是DB状态&#xff0c;并且…