JVM——类加载与字节码技术—字节码指令
2.字节码指令
2.1 入门

jvm的解释器可以识别平台无关的字节码指令,解释为机器码执行。


2a b7 00 01 b1
this . init() return

准备了System.out对象,准备了参数“hello world”,准备了对象的方法println(String)V,并return

2.2 javap 工具

这里常量池直接把查询结果放在了右边。
有了javap,终于不用看那狗屎字节码文件了
这部分是方法信息里的init构造方法。

main方法
有参数类型,访问类型,方法属性,局部变量表,方法参数信息等等

2.3 图解方法执行流程
1)原始 java 代码

b是Short类型的最大值+1。
2)编译后的字节码文件


3)常量池载入运行时常量池
java代码执行时会由java虚拟机的类加载器将main方法所在类进行类加载。
类加载就是把class文件里的字节数据读取到内存里面。
运行时常量池是方法区的组成部分

32768对应的是源代码里面的short.value+1,比较小的数字不会存储在常量池,比如10,10会跟着方法的字节码指令存一起,一旦数字范围超过整数最大值就会存储在常量池中。
4)方法字节码载入方法区

5) main 线程开始运行,分配栈帧内存

绿色区域是局部变量表,蓝色是操作数。字节码指令里面有一个栈的最大深度和局部变量表的长度。这两项决定了栈帧内存大小。

6)执行引擎开始执行字节码
bipush 10
istore_1

然后a被复制为10,对应操作就是a=10
1dc #3

istore 2

iload1
局部变量表中不能执行a+b的操作,所以,执行引擎会对它们进行一个读取。

iload2

iadd

iadd操作是将操作数栈中的两个数取出来相加再放回去。
istore 3
给c赋值


getstatic #4
这个是到常量池中找一个成员变量的引用。这里是找System.out。找到之后不是把对象放入操作数栈,而是获取引用

iload_3
执行打印需要参数c,所以将局部变量表中c的值32778读入到操作数栈


invokevirtual #5
在常量池中找到5号条目,执行println(I)方法,参数 l 表示整数。

println方法执行时会找到方法区中新的方法,然后分配一个新的栈帧
执行时会把32778作为参数传递给新的栈帧中作为整数参数完成打印操作。

return

2.4练习-分析a++

分析
a++执行的指令是iinc,但是这玩意直接原地拉屎变大,不需要进栈又出栈。
a++是iload先,++a是iinc先
iinc的两个参数,一个是要对哪个槽位做自增,一个是自增多少。







到这里第一个加法结束了。



2.5 条件判断指令


较小的数用iconst表示,-1到5的数
ifne 不成立时会跳转到12行,压20入栈然后往下执行。
成立时就直接往下执行然后到goto跳过12,14,直接返回


2.6 循环控制指令

依旧是if+goto

if_icmpge判断是否大于等于10,是的话就跳到14
do_while

for循环

2.7 练习 - 判断结果

先load,再iinc,最后istore,又把栈里的load到的数据放回去了。
先把0读进操作数栈的,然后局部变量表上x自增1变成,然后将局部变量表上的0赋值给x.
2.8 构造方法
1) <cinit>()v
静态变量初始化,静态代码块从上到下依次执行


cinit是整个类的构造方法。
2) <init>()V
init是实例的构造方法。

从上到下有成员变量,初始化代码块,有参构造。
最后答案是s3 30


2.9方法调用

类中从上到下有构造方法,私有方法,final方法,公共方法,静态方法。
通过对象和类型都调用了静态方法
有三种指令出现。
invokevirtual是动态绑定,公共方法有可能子类也有可能父类,要在运行时确定。
另外两个都是静态绑定,可以直接找到执行地址。
执行new的时候会先分配内存给它,然后把对象的引用放到操作数栈。
dup是对栈顶的复制,操作数栈里有两个相同的引用。
invokespecial会根据栈顶的引用调用对应的构造方法。 这里消耗一个引用
astore_1会根据剩余的引用出栈存储到局部变量表中。这里消耗一个引用
执行到d.test4()时先把引用放入栈,但由于静态方法不需要引用,所以又pop弹出了,然后用invokestatic执行test4了。
要调用静态方法直接用类名去调用即可,否则会产生多余的虚拟机指令。

2.10 多态的原理
在上面有一个invokevirtual不能直接找到地址去执行,需要找到是父类还是子类。
研究invokevirtual就是研究多态的原理
面试高频题:讲讲什么是多态,底层原理是啥
1) 运行代码
64位操作系统为了节省内存用了指针压缩,查看地址时要换算不方便


代码中一个Animal父类,一个抽象方法eat(),一个toString方法,还有两个子类继承了Animal父类。
在公共类中有一个test方法,参数是Animal,这里产生了多态,实际对象可能是cat,也可能是dog.

2)运行 HSDB 工具
JDK9之后,执行JHSDB HSDB
3)找某个对象


查询语句和sql语句十分相似,这里通过查询类型别名查到dog对象在内存中的地址。
这里虚拟机中只有一个dog对象,所以查到的是唯一dog.
4)查看对象内存结构

5) 查看对象 Class 的内存地址

第二行是类型指针,用类型指针继续查

上面是类的结构。
6)查看类的 vtable
接着找类中的方法,多态的方法存在vtable虚方法表中。在类结构的最后。

是该类的地址加上1B8就是vtable地址。vtable长度是6。
然后看见6个支持重写的方法的入口地址。

7)验证方法地址

在虚方法表中的最后一个方法对应的就是dog类的eat方法。
因为dog类没有重写父类,用的是Animal的toString方法。

方法表中的第一项有Object的finalize,clone,equals方法 ,因为Animal和dog都没有重写这些方法。
8) 小结
一句话总结:invokevirtual指令调用的对象vtable中的方法

类加载阶段指的是 验证、准备、解析 这三个阶段,即加载之后,初始化之前、
2.11 异常处理
try-catch

2 4 是try中的内容, try中如果没有发生异常,就会直接去到12了。
借助Exception table异常表检测[2~5)行内容,不包含5,2~4有异常会先跟声明的异常是否一致或是子类异常,是的话就会进入第8行。
第8行astore_2是把异常对象的引用地址存储下面局部变量的e槽位上,就是catch那一行的执行。
9,11就是i=20.

多个single-catch 块的情况



与try_catch的相差不多。

multi-catch 的情况

直接一个catch块捕获多个异常。

finally

字节码



因为有可能发生Exception父类的异常,所以异常表里面又多了别的异常类型。
finally的工作方法就是将finally中的东西放在每一个分支后面,在reutrn前面,以此保证一定会被执行。
因此有三个分支,一个是try,一个是Exception的catch,一个是非Exception的catch.

2.12 练习 - finally 面试题
finally 出现了 return

正确答案是20。


简单来说,就是即使报了异常,但是最后还是执行finally例的ireturn,不会执行athrow
抛异常和返回值,这两个是冲突的,只能执行一个,平时绝对不能在finally中return

该代码最后正常执行完没有除零报错。
finally 对返回值影响

最后返回的是10

2.13 synchronized

new时复制了一份,一个用于调用构造方法,一个是给了局部变量表。
synchronized(lock)先将lock引用加载到操作数栈,然后又复制了一份。
待会一个给monitorenter 指令用,一个给了monitorexit指令用,加锁和解锁。
然后一个lock存入局部变量表2槽,剩下那个给了monitorenter 加锁。
然后12~17是打印指令
20~22是把2号槽位的引用加载到栈顶并给monitorexit解锁,然后goto return正常结束。


如果12~22有异常会进到25.
25将错误保存到局部变量表。26~27将lock引用给monitorexit解锁。
28,29加载异常类抛出。

相关文章:
JVM——类加载与字节码技术—字节码指令
2.字节码指令 2.1 入门 jvm的解释器可以识别平台无关的字节码指令,解释为机器码执行。 2a b7 00 01 b1 this . init() return 准备了System.out对象,准备了参数“hello world”,准备了对象的方法println(String)Vÿ…...
同步与互斥——相互合作,相互制约
选择题:互斥机制,信号量解决互斥同步 大题:PV操作处理进程的同步与互斥 目的:解决临界区资源使用问题 一、临界资源 一次仅允许一个进程使用的资源 二、同步与互斥 同步:AB相互合作,A放B取,…...
7个改变玩法规则的ChatGPT应用场景
ChatGPT因各种原因受到了广泛关注:ChatGPT可以充当各种改善生活改进工作的小助手,如内容写手、客户支持、语言翻译、编码专家等等。只需在你的聊天内容中添加适当的提示,人工智能将为你提供各项支持。[1] 1.ChatGPT作为内容写手 通过AI的帮助…...
软考高级系统架构设计师系列论文七十九:论软件产品线技术
软考高级系统架构设计师系列论文七十九:论软件产品线技术 一、摘要二、正文三、总结一、摘要 根据公司软件系统开发的需要,我们在软件的开发过程中引入了软件产品线技术,成立了基于软件产品线的项目组。本人有幸参加了该项目,并在其中担任软件分析与设计、软件产品线核心资…...
Spring IOC容器:让Java对象的管理和配置更简单
一、简介 在Java开发中,我们经常需要创建和使用各种Java对象,例如实体类,服务类,控制器类等。这些对象之间通常存在着一定的依赖关系,例如一个服务类可能需要调用另一个服务类或一个数据访问类的方法。为了创建和使用…...
【C++小项目】实现一个日期计算器
目录 Ⅰ. 引入 Ⅱ. 列轮廓 Ⅲ. 功能的实现 构造函数 Print 判断是否相等 | ! ➡️: ➡️!: 判断大小 > | > | < | < ➡️>: ➡️<: ➡️>: ➡️<: 加减天数 | | - | - ➡️:…...
Ext JS 之Microloader(微加载器)
“Microloader”是 Sencha 数据驱动的 JavaScript 和 CSS 动态加载器的名称。 清单 app.json 用于应用的设置,Sencha Cmd 在构建的时候会读取这个文件。 Sencha Cmd 转换“app.json”的内容并将生成的清单传递给 Microloader 以在运行时使用。 最后,Ext JS 本身也会查阅运…...
【科研】-- 如何将Endnote中参考文献格式插入到Word?
文章目录 如何将Endnote中参考文献格式插入到Word? 如何将Endnote中参考文献格式插入到Word? 1、首先确保Endnote和Word安装正确,正常可以从学校官网中下载到正版软件,下载后在word栏目中会出现EndNote的标签; 2、可…...
Python爬虫实战案例——第二例
某某美剧剧集下载(从搜索片名开始) 本篇文章主要是为大家提供某些电影网站的较常规的下载电影的分析思路与代码思路(通过爬虫下载电影),我们会从搜索某部影片的关键字开始直到成功下载某一部电影。 地址:aHR0cHM6Ly93d3cuOTltZWlqdXR0LmNvbS9pbmRleC5od…...
深入理解Spring的ImportBeanDefinitionRegistrar接口及其应用
0 导言 ImportBeanDefinitionRegistrar接口在动态注册Bean定义方面发挥着重要作用。本篇博客将深入探讨ImportBeanDefinitionRegistrar接口的作用、用法以及实际应用场景。 1 简介 ImportBeanDefinitionRegistrar接口是Spring Framework中的一个关键接口,位于org…...
【面试题】你理解中JS难理解的基本概念是什么?
前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 作用域与闭包 作用域 作用域是当前的执行上下文,值和表达式在其中“可见”或可被访问。如果一个变量或表达式不在当前的作用域中࿰…...
微服务中间件--MQ服务异步通信
MQ服务异步通信 MQ服务异步通信a.消息可靠性1) 生产者消息确认2) 消息持久化3) 消费者消息确认4) 消费者失败重试4.a) 本地重试4.b) 失败策略 b.死信交换机1) 初识死信交换机2) TTL3) 延迟队列a) 安装延迟队列插件b) SpringAMQP使用延迟队列插件 c.惰性队列1) 消息堆积问题2) 惰…...
爆火「视频版ControlNet」开源了!靠提示词精准换画风,全华人团队出品
“视频版ControlNet”来了! 让蓝衣战神秒变迪士尼公举: 视频处理前后,除了画风以外,其他都不更改。 女孩说话的口型都保持一致。 正在插剑的姜文,也能“下一秒”变猩球崛起了。 这就是由全华人团队打造的最新视频处理…...
常用的数据可视化工具有哪些?要操作简单的
随着数据量的剧增,对分析效率和数据信息传递都带来了不小的挑战,于是数据可视化工具应运而生,通过直观形象的图表来展现、传递数据信息,提高数据分析报表的易读性。那么,常用的操作简单数据可视化工具有哪些࿱…...
ssl卸载原理
SSL卸载,也称为SSL解密,是一种将SSL加密数据流卸成非加密的明文数据流的过程。SSL卸载通常在负载均衡器、代理服务器、WAF等设备中实现,可以提高传输效率和安全性。 SSL卸载的原理是将SSL数据流拦截下来,通过设备内置的证书进行解…...
【C语言】动态内存管理,详细!!!
文章目录 前言一、为什么存在动态内存分配二、动态内存开辟函数的介绍1.malloc2.calloc3.realloc4.free 三、动态内存开辟中的常见错误1.误对NULL进行解引用操作2.对于动态开辟的空间进行了越界访问3.对于非动态开辟的内存进行了free操作4.只free掉动态开辟内存的一部分5.多次f…...
2023年国赛 高教社杯数学建模思路 - 案例:退火算法
文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…...
jenkins 日志输出显示时间戳的方式
网上很多方式比较片面,最新版插件直接使用即可无需更多操作。 使用方式如下: 1.安装插件 Timestamper 2.更新全局设置 系统设置-找到 Timestamper 勾选 Enabled for all Pipeline builds 也可修改时间戳格式。 帮助信息中显示 When checked, timesta…...
geacon_pro配合catcs4.5上线Mac、Linux
我的个人博客: xzajyjs.cn 一些链接 Try师傅的catcs4.5项目: https://github.com/TryGOTry/CobaltStrike_Cat_4.5,最新版解压密码见:https://www.nctry.com/2708.html geacon_pro: https://github.com/testxxxzzz/geacon_pro BeaconTool.jar: https:/…...
vue 实现腾讯地图搜索选点功能(附加搜索联想功能)
注意:开发环境、正式环境需在腾讯地图配置ip地址白名单、域名白名单 封装map组件: <template><iframe width"100%" style"border: none;width: 100%;height: 100%;" :src"map_src"></iframe> </t…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...


