JVM学习-底层字节码的执行过程

目录

1.一个简单的程序分析

2. a++,++a,a--在JVM中的执行过程 

3. 一个好玩的x=x++

4.方法调用的字节码分析、多态的实现、对象头

5. try-catch-finally的字节码分析 

        5.1 try-catch

        5.2 try-catch-finally 

        5.3特殊情况 

                5.3.1 try和finally块中都出现了return

                5.3.2出现多个catch块

6.加锁和解锁的字节码分析

7.静态成员变量初始化以及普通成员变量初始化的字节码分析 

        7.1静态成员变量初始化

        7.2普通成员变量初始化 

8.可变参数的实现


1.一个简单的程序分析

2. a++,++a,a--在JVM中的执行过程 

3. 一个好玩的x=x++

        在IDEA中也会提示x++的值未被使用: 

4.方法调用的字节码分析、多态的实现、对象头

        构造方法、私有方法、final方法使用的关键字是invokespecial,普通的public方法使用的是invokevirtual,静态方法使用的是invokestatic。当使用new方法创建对象时,会先在堆内存中分配空间,分配成功后会将对象的引用放到操作数栈,再通过关键字dup来对栈顶元素也就是这个引用进行复制,再通过invokespecial执行构造方法,构造完成后这个复制的对象引用就会被弹出,所以栈中还剩下原来的对象引用,最后会将这个引用赋给变量;倘若没有dup复制,那么在构造完成后就会将仅有的对象引用弹出,就无法赋给变量。静态方法不需要对象来调用,直接调用即可,如果使用对象调用静态方法,那么在底层的字节码指令中会先让对象的引用入栈,准备进行方法调用时发现是一个静态方法,那么就会将这个对象的引用弹出,然后直接通过invokestatic调用静态方法,这就会多执行一次入栈和弹出操作。

        延伸,多态的实现

        多态是对一个接口中的所有方法进行多种方式的实现,比如一个接口Animal,有一个say方法,而对于不同的动物Dog和Cat,要实现Animal的say方法肯定是不一样的。

//Animal接口
public interface Animal{//要实现的方法saypublic void say();}//Dog实现类
public class Dog{public void say(){System.out.println("汪汪");}}//Cat实现类
public class Cat{public void say(){System.out.println("喵喵");}}//在main方法中选择一个实现类来实现say方法Animal am=new Dog();am.say();//输出“汪汪”

        那么这种多态是怎么实现的呢?

        首先要实现的方法必须是public的,而public的方法调用使用的JVM指令是invokevirtual,所以关键就在于invokevirtual是怎样调用方法的。当使用invokevirtual进行方法调用时,会先通过栈帧中的对象引用找到对象(也就是先找到new的Dog对象),然后从对象头中的类型指针找到它是哪个类的实例(即从new的这个Dog对象的对象头中的类型指针了解到这是一个Dog类的对象,类型指针指向的其实是这个类的Class对象,也叫做类镜像),这个类的Class对象中包含一个虚方法表vtable,这个vtable在类加载的链接阶段就已经根据方法的重写规则生成好了,从这个表中就能获得这个类中每个方法的入口地址(也就是Dog类的Class文件中有一个虚方法表,这个表里包含了其所有方法的入口地址,所以从这个虚方法表中就知道了Dog类的say方法在什么地方),根据这个地址就可以知道方法的字节码并去执行(查到了Dog类的say方法的地址后invokevirtual指令就会到这个地址找到对应的say方法并调用)。虚方法表实际上不在Class对象中,这里为了方便理解简化了,具体结合另一篇博客JVM学习-类加载的加载部分理解

        所以,如果将实现类换成Cat,那么所创建的对象的对象头中的类型指针指向的就是Cat的Class对象,然后从Cat类的虚方法表中找到Cat的say方法地址进而去调用。

        上面涉及到了对象头,对象头的一部分是Mark Word,包含了对象运行时的数据,比如用于快速定位对象在数组或散列表中的位置的Hash Code,对象当前的寿命以及锁状态等;另一部分是对象的类型指针,指向类的Class对象,通过这个指针可以确定该对象是哪个类的实例。

5. try-catch-finally的字节码分析 

        5.1 try-catch

        5.2 try-catch-finally 

        5.3特殊情况 

                 5.3.1 try和finally块中都出现了return

                5.3.2出现多个catch块

6.加锁和解锁的字节码分析

7.静态成员变量初始化<clinit>以及普通成员变量初始化<init>的字节码分析 

        7.1静态成员变量初始化<clinit>

 

        Field表示成员变量,图中标错了。

        7.2普通成员变量初始化<init> 

        源代码:

        局部变量表:

        字节码分析 :

        注意区分局部变量表中的a、b和运行时常量池中的a、b,前面的a和b是有参构造方法中的两个参数,后面的a、b则是两个成员变量。普通成员变量和静态成员变量都是在常量池中的,所有的成员变量都是类的一部分,而常量池中存放着类的相关信息。 

8.可变参数的实现

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到…

SQL的执行与优化

文章目录 MySQL查询原理与优化一、select语句的执行顺序二、join 的执行与优化1、驱动表 & 被驱动表2、Simple Nested Loop Join3、Index Nested Loop Join4、Block Nested Loop Join5、Hash Join6、join 优化小结 三、on 与 where 对比四、group by 的执行与优化1、group …

刚刚离乳的幼猫该如何选择猫粮品牌?

亲爱的猫友们&#xff0c;当你家的幼猫刚刚离乳&#xff0c;准备踏入猫粮的世界时&#xff0c;如何选择一款合适的猫粮品牌确实是个让人头疼的问题。&#x1f43e; 别担心&#xff0c;今天我就来为大家推荐一款值得信赖的幼猫粮——福派斯幼猫粮。 1️⃣ 考虑幼猫的营养需求 幼…

macOS系统中通过brew安装MongoDB

Macos 修改目录权限&#xff1a; sudo chmod -R 777 你的文件夹 本文使用homebrew进行安装简单&#xff0c;因为从官网下载安装包并手动安装需要移动安装包到合适的目录下并配置环境变量等一大堆操作后才能使用数据库&#xff08;若没有安装过brew请自行百度进行安装brew&am…

ArkTs的资源Resource类型怎么转为string

使用ResourceManager同步转换 请参看&#xff1a;ResourceManager.getStringSync9 例子&#xff1a; try { let testStr: string this.context.resourceManager.getStringSync($r(app.string.test).id); } catch (error) { console.error(getStringSync failed, error code…

【四 (5)数据可视化之 Pyecharts常用图表及代码实现 】

目录 文章导航一、介绍[✨ 特性]二、安装Pyecharts三、主题风格四、占比类图表1、饼图2、环形图3、玫瑰图4、玫瑰图-多图5、堆叠条形图6、百分比堆叠条形图 五、比较排序类1、条形图2、雷达图3、词云图4、漏斗图 六、趋势类图表1、折线图2、堆叠折线图3、面积图4、堆叠面积图 七…

【AI】Ubuntu系统深度学习框架的神经网络图绘制

一、Graphviz 在Ubuntu上安装Graphviz&#xff0c;可以使用命令行工具apt进行安装。 安装Graphviz的步骤相对简单。打开终端&#xff0c;输入以下命令更新软件包列表&#xff1a;sudo apt update。之后&#xff0c;使用命令sudo apt install graphviz来安装Graphviz软件包。为…

MySQL语法分类 DQL(1)基础查询

//语法 select 字段列表 from 表名列表 where条件列表 group by分组字段 having 分组后的条件 order by排序 limit 分页限定为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),ma…

将 OpenCV 与 Eclipse 结合使用(插件 CDT)

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;将OpenCV与gcc和CMake结合使用 下一篇&#xff1a;OpenCV4.9.0在windows系统下的安装 警告&#xff1a; 本教程可以包含过时的信息。 先决条件 两种方式&#xff0c;一种…

CODESYS开发教程13-长字符串处理

摘要&#xff1a;这是一篇写给新手的关于CODESYS开发环境的小白教程&#xff0c;一看就懂...... 在以前的《CODESYS开发教程7-字符串及其基本操作》教程中&#xff0c;介绍了字符串及其基本操作&#xff0c;有朋友看了以后觉得不过瘾&#xff0c;希望有一些关于字符串的更加深入…

javaweb员工健康管理监护系统

项目演示视频 &#xff08;链接&#xff1a;https://pan.baidu.com/s/1WliYEUH4c0HVB7s0-1WDUA 提取码&#xff1a;1234 --来自百度网盘超级会员V5的分享&#xff09; 该项目所用到技术 java ssh框架 3&#xff1a;该项目的用到的开发工具&#xff1f; eclipse和idea都可以、m…

Echo框架:高性能的Golang Web框架

Echo框架&#xff1a;高性能的Golang Web框架 在Golang的Web开发领域&#xff0c;选择一个适合的框架是构建高性能和可扩展应用程序的关键。Echo是一个备受推崇的Golang Web框架&#xff0c;以其简洁高效和强大功能而广受欢迎。本文将介绍Echo框架的基本特点、使用方式及其优势…

JVM学习-垃圾回收专题

目录 1.如何判断对象可以回收 1.1引用计数法 1.2可达性分析算法 1.3五种引用 1.4拓展&#xff1a;直接内存 2.垃圾回收算法 2.1标记清除算法 2.2标记整理算法 2.3复制 3.分代垃圾回收 3.垃圾回收器 3.1串行垃圾回收器 3.2吞吐量优先垃圾回收器 3.3响应时间优先垃圾回收器…

Qt 实现 Asterix 报文解析库

【写在前面】 最近工作中需要解析 Cat 21 和 Cat 62 的 ADS-B 数据 ( 自己的工作包含航空领域 )。 然后&#xff0c;因为整个 Asterix 协议类别非常之多&#xff0c;每个类别的版本也多&#xff0c;纯手工实现每个版本解析根本不现实 ( 然鹅公司之前的解析库就是这么做的且做的…

win10 + cpu + pycharm + mindspore

MindSpore是华为公司自研的最佳匹配昇腾AI处理器算力的全场景深度学习框架。 1、打开官网&#xff1a; MindSpore官网 2、选择以下选项&#xff1a; 3、创建conda 环境&#xff0c;这里python 选择3.9.0&#xff0c;也可以选择其他版本&#xff1a; conda create -c conda-…

智慧交通:构建智慧城市的重要一环

随着信息技术的飞速发展&#xff0c;智慧城市已成为现代城市发展的重要方向。作为智慧城市的重要组成部分&#xff0c;智慧交通以其高效、便捷、环保的特性&#xff0c;成为推动城市现代化进程的关键力量。本文将从智慧交通的概念、发展现状、面临挑战以及未来趋势等方面&#…

MySQL语法分类 DDL(1)

DDL&#xff08;1&#xff09;(操作数据库、表) 数据库操作(CRUD) C(Create):创建 //指定字符集创建 create database db_1 character set utf8;//避免重复创建数据库报错可以用一下命令 create database if not exists db_1 character set utf8;R(Retrieve):查询 //查询所…

物联网竞赛板CubMx全部功能简洁配置汇总

目录 前言&#xff1a;1、按键&LED灯配置&#xff1a;2、OLED配置&#xff1a;3、继电器配置&#xff1a;4、LORA模块配置&#xff1a;5、矩阵模块&#xff1a;6、串口模块&#xff1a;7、RTC配置&#xff1a;8、ADC模块配置&#xff1a;9、温度传感器模块&#xff1a;后续…

cartographer学习与使用

记录一下在配置和使用cartographer建图时遇到的各种问题吧。 我的数据 配置文件&#xff1a; my_rslidar.launch <launch> <param name"/use_sim_time" value"false" /> <!--启动建图节点--> <node name"cartographer_n…

旋转花键的制造工艺

旋转花键的制造工艺是一门精细的技术&#xff0c;涉及多个步骤和精细的操作&#xff0c;以确保最终产品的质量和性能&#xff0c;下面简单介绍下旋转花键的制造工艺。 1、原材料准备&#xff1a;制造旋转花键的核心是选择合适的材料&#xff0c;根据花键的规格和性能要求&#…