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…...
解密长短时记忆网络(LSTM):从理论到PyTorch实战演示
目录 1. LSTM的背景人工神经网络的进化循环神经网络(RNN)的局限性LSTM的提出背景 2. LSTM的基础理论2.1 LSTM的数学原理遗忘门(Forget Gate)输入门(Input Gate)记忆单元(Cell State)…...
17.1.2 【Linux】systemd使用的unit分类
systemd 有什么好处? 平行处理所有服务,加速开机流程: 旧的 init 启动脚本是“一项一项任务依序启动”的模式,因此不相依的服务也是得要一个一个的等待。但目前我们的硬件主机系统与操作系统几乎都支持多核心架构了,s…...
vue离线缓存资源文件
本文章主要是解决大文件,实时请求资源浪费网络资源的问题 从而有效的将解决用户体验的问题 话不多说上才艺 ⬇️⬇️⬇️⬇️⬇️⬇️⬇️ 找到项目中的 index.html 文件,并在 html 标签中加入 manifest"manifest.appcache" 安装 appcache-manifest 包 npm ins…...
2023华为杯研赛数学建模A题B题C题D题E题F题资料 华为杯
本次比赛我们将会全程更新华为杯研赛赛题思路模型及代码,大家查看文末名片获取 之前华为杯相关的资料和助攻可以查看 2022华为杯数学建模研赛选题建议和思路分析_方形件组批优化问题_UST数模社_的博客-CSDN博客 我们华为杯更新的流程如下: A题思路&a…...
星际争霸之小霸王之小蜜蜂(六)--让子弹飞
目录 前言 一、添加子弹设置 二、创建子弹 三、创建绘制和移动子弹函数 四、让子弹飞 五、效果 总结 前言 小蜜蜂的基本操作已经完成了,现在开始编写子弹的代码了。 一、添加子弹设置 在我的预想里,我们的小蜜蜂既然是一只猫,那么放出的子弹…...
opencv简单使用
cv2库安装, conda install opencv-python注意cv2使用时,路径不能有中文。(不然会一直’None’ _ update # 处理中文路径问题 def cv_imread(file_path): #使用之前需要导入numpy、cv2库,file_path为包含中文的路径return cv2.imd…...
SpringBoot 微人事 职称管理模块(十三)
职称管理前端页面设计 在职称管理页面添加输入框 export default {name: "JobLevelMarna",data(){return{Jl:{name:""}}}}效果图 添加一个下拉框 v-model的值为当前被选中的el-option的 value 属性值 <el-select v-model"Jl.titlelevel" …...
动态规划之0-1背包问题
动态规划之0-1背包问题 文章目录 动态规划之0-1背包问题一、先给出代码二、讲解第一步:初始化第二步:动态规划,填表第三步:回溯,找到选择方案总结 三、进阶(用一维数组解决问题) 一、先给出代码…...
为什么需要单元测试?
为什么需要单元测试? 从产品角度而言,常规的功能测试、系统测试都是站在产品局部或全局功能进行测试,能够很好地与用户的需要相结合,但是缺乏了对产品研发细节(特别是代码细节的理解)。 从测试人员角度而言…...
《合成孔径雷达成像算法与实现》Figure3.13——匹配滤波器的三种实现方式
clc clear close all% 参数设置 TBP 80; % 时间带宽积 T 10e-6; % 脉冲持续时间 N_ZD 60; % 零频点位于中点右侧的距离,P58% 参数计算 B TBP/T; …...
wordpress导入淘宝/百度seo优化关键词
前言 有段时间没发文了,学习群里有位同学经常问(鞭策)我,催进度,说实话,让我倍感欣慰。 synchronized 说实话很早就想写了,因为在现在的面试中 synchronized 的地位基本和 HashMap 类似&#…...
如何用flash做网站/营销技巧培训
环境:VC toolkit 2003 SystemC 2.0.1 为了找出SystemC定义了哪些全局变量/静态变量,我在crt/src/crt0dat.c的 void _initterm(_PVFV * pfbegin, _PVFV * pfend) 函数中设下断点,at Line 598: if ( *pfbegin ! NULL ) …...
做笑话网站赚钱吗/友情链接购买网站
欢迎来到containerd的v1.1.6版本! 这是containerd 1.1版本的第六个补丁版本。这个发布专门跟新了runc以修复CVE-2019-5736容器逃逸漏洞。几个CRI修复也包括在内此版本并列在下面。 运行引擎 Update runc to 6635b4f0c6af3810594d2770f662f34ddc15b40d to fix CVE-20…...
wordpress 转织梦/五合一网站建设
设定时区以及语言 LANGUAGE_CODE zh-hansTIME_ZONE Asia/ShanghaiUSE_I18N TrueUSE_L10N TrueUSE_TZ False 设置好admin就能显示中文界面,时间也是本地时间 设定MEDIA用户上传文件目录 在Django中新增一个media文件夹用于专门存储用户上传文件 settings需设置 …...
湘潭哪里做网站 电话/银川网站seo
代码矗用分为静态和动态两种。在上 节介绍的方式是代码的静态重用,这种方式是代码级的重用,也就是将需要重用的代码和使用这些代码的使用者放在 起进行编译,最终生成 个可执行文件或程序C. ko .so 等) 8-1 测试 mu ti fi iver 驱动…...
网站本地被劫要怎么做/谷歌应用商店app下载
fastutil介绍: fastutil是扩展了Java标准集合框架(Map、List、Set;HashMap、ArrayList、HashSet)的类库,提供了特殊类型的map、set、list和queue; fastutil能够提供更小的内存占用,更快的存取速…...