Java 方法执行原理底层解析

java 文件经过javac编译后,变成了存储了一系列指令的.class文件。本文从指令层面分析Java 方法从解析、调用到执行的过程。

1 指令

一般格式:操作码 [操作数1] [操作数2] ...

操作码

1个字节的无符号整数(范围:0x00 ~ 0xFF)。

特点:1)每个操作码对应一个助记符(如iconst_1,iload,iadd等)。2)操作码决定了操作数类型及个数。

操作数

操作码所需的参数,紧跟在操作码后面。

表 指令的组成

1.1 未对齐的操作数

操作数的基本单位是字节。为了让.class文件更紧凑,jvm没有让操作数对齐。这意味着JVM需要逐个字节读取。

例如指令:0x11 0x03 0xE8 (sipush 1000)

0x11 是操作码,它的助记符是sipush。这个操作码的参数是1个2字节长度的操作数。

jvm 先读取第1个字节0x03,然后读取第2个字节 0xE8,最后将这两个字节组合:

(0x03 << 8) | 0xE8 => 0x03E8。

1.2 指令的执行模型

不考虑异常处理的话,JVM的解释器解析.class文件中的指令伪代码如下:

do {PC 寄存器值++;根据PC寄存器指示的位置,读取操作码;if (操作码需要操作数) 读取操作数;执行操作码所定义的操作;
} while(字节流长度 > 0);

1.3 方法相关指令

invokestatic

静态方法。

invokespecial

需要特殊处理的实例方法,包括实例初始化、私有方法、和super调用。

invokevirtual

虚方法分派(可被重写的方法及final方法)。

invokeinterface

接口方法,在运行期间再确定一个实现该接口的对象。

invokedynamic

先在运行时动态解析调用点限定符所引用的方法,然后再执行该方法。Java 7 引入,用于支持动态语言特性,比如Lambda

表 调用方法的指令

方法调用指令和数据类型无关,而方法返回指令根据返回值类型区分,包括ireturn、lreturn、freturn、dreturn、areturn(返回值为对象、数组等引用类型)及return(返回值为void)。

1.3.1 类与实例的初始化

<clinit>

类(或接口)的静态初始化方法。用于执行静态变量的赋值和静态代码块。

如果父类未初始化,会先触发父类的clinit方法,但接口的clinit不会因为实现类的初始化而触发(需要直接使用接口的静态变量才触发)。

<init>

对象的初始化方法,用于实例变量的赋值、实例代码块及构造器。

每个构造器对应一个init方法;子类构造器会隐式调用父类的init方法。

表 类与实例初始化方法

<clinit> 与<init>方法都是由编译器自动生成,用户无法调用。

2 方法调用

java 是一门静态多分派(和接收者及参数有关)、动态单分派(只能接收者有关)的语言。

静态分派:方法的静态类型在编译阶段是可知的(如方法重载,取决于参数类型、数量及位置)。

动态分派:运行时类型要在运行期才可知(方法重写,取决于执行对象的实际类型)。

2.1 虚方法表

JVM 在类初始化过程中,会为这个类维护一个虚拟方法表,存储该类所有可被重写的方法的入口地址。

虚方法表可理解为一个数组,每个数组元素(槽位)存储的是方法的入口地址。

虚方法表创建步骤如下

1)父类的方法按声明顺序占据虚方法表的固定槽位。

2)子类继承父类的虚方法表,并保留父类方法的地址。

3)如果子类重写了父类的方法,子类的虚方法中对应的槽位会被替换为子类方法的地址。

4)子类新增的方法追加到虚方法表的末尾。

例如 Animal类又两个可重写的方法sound和eat,Dog类继承Animal类,并重写了eat方法,又新增了一个方法wagTail。则这两个类的虚方法表如下。

Animal类的虚方法表

Dog类的虚方法表

索引

方法地址

索引

方法地址

0

Animal.sound()

0

Animal.sound()

1

Animal.eat()

1

Dog.eat()

2

Dog.wagTail()

表 Animal 与 Dog类的虚方法表

2.1.1 动态分派过程

当父类引用调用方法时,JVM执行步骤如下:

  1. 获取对象的实际类型。
  2. 根据对象的实际类型查找对应的虚方法表。
  3. 根据方法调用指令的操作数(虚方法表的索引),找到方法入口地址。
  4. 执行对应方法。

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

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

相关文章

【数学建模】最大最小值模型详解

数学建模中的最大最小值模型详解 文章目录 数学建模中的最大最小值模型详解引言最大最小值模型的基本概念最大化问题最小化问题 常见的求解方法1. 微积分法2. 线性规划3. 非线性规划4. 动态规划 实际应用案例案例1&#xff1a;生产规划问题案例2&#xff1a;投资组合优化 最大最…

C#的List和DIctionary实现原理(手搓泛型类以及增删查改等功能)

这里写自定义目录标题 ListDIctionary List MyList类&#xff1a;这是一个泛型类&#xff0c;能够存储任意类型的元素。 _items数组&#xff1a;用于实际存储元素。 _size变量&#xff1a;记录当前列表中的元素数量。 构造函数&#xff1a;初始化数组容量为 4。 Count属性&…

Linux系统管理与编程08:任务驱动综合应用

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 [环境] windows11、centos9.9.2207、zabbix6、MobaXterm、Internet环境 [要求] zabbix6.0安装环境&#xff1a;Lamp&#xff08;linux httpd mysql8.0 php&#xff09; [步骤] 3 …

数据结构之基本队列-顺序结构实现-初始化-判断队列是否为空(front=rear)-出队-入队-队尾满了,调整队列-获取队头元素

数据结构之基本队列-顺序结构实现-初始化-判断队列是否为空(frontrear)-出队-入队-队尾满了&#xff0c;调整队列-获取队头元素——完整可运行代码 #include <stdio.h>#define MAXSIZE 100 typedef int ElemType;typedef struct {ElemType data[MAXSIZE];int front;int…

基于LabVIEW的Windows平台高速闭环控制

在Windows系统下&#xff0c;通过LabVIEW实现高速闭环控制面临两大核心挑战&#xff1a;非实时操作系统的调度延迟与硬件接口的传输速度限制。以USB-6351&#xff08;NI USB-6351 DAQ卡&#xff09;为例&#xff0c;其理论采样率可达1.25 MS/s&#xff08;单通道&#xff09;&a…

Java面试黄金宝典8

1. 什么是 Spring MVC 定义 Spring MVC 是 Spring 框架里用于构建 Web 应用程序的模块&#xff0c;它严格遵循 MVC&#xff08;Model - View - Controller&#xff09;设计模式。这种设计模式把应用程序清晰地划分成三个主要部分&#xff1a; Model&#xff08;模型&#xff0…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 RESTful API 设计:从上手到骨折

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整活…

分享最近前端面试遇到的一些问题

前情提要&#xff08;分享个人情况&#xff0c;可以直接跳过&#xff09; 先说一下我的个人情况&#xff0c;我是2026届的&#xff0c;目前是在找前端实习。 3月初&#xff0c;从3月3日开始在Boss上投简历。 分享我的个人故事&#xff0c;不想看可以直接滑到下面&#xff0c;…

rip 协议详细介绍

以下是关于 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09; 的详细介绍&#xff0c;涵盖其工作原理、版本演进、配置方法、优缺点及实际应用场景。 1. RIP 协议概述 类型&#xff1a;动态路由协议&#xff0c;基于距离矢量算法&#xff08…

scrapy入门(深入)

Scrapy框架简介 Scrapy是:由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架&#xff0c;用于抓取web站点并从页面中提取结构化的数据&#xff0c;只需要实现少量的代码&#xff0c;就能够快速的抓取。 新建项目 (scrapy startproject xxx)&#xff1a;新建一个新的…

KiLog2MaximumIncrement的由来和KiMaximumIncrementReciprocal的由来

第一部分&#xff1a;KiLog2MaximumIncrement的由来 i 1; j KeMaximumIncrement; while ((1UI64<<i) < KeMaximumIncrement) { i; } KiLog2MaximumIncrement i; 2^17131072 2^18262144 i18KiLog2MaximumIncrement 中…

数据结构-ArrayList

文章目录 1. 线性表2. 顺序表3. ArrayList4. ArrayList的问题以及思考4.2 增容的性能消耗问题4.3 空间浪费问题 1. 线性表 线性表&#xff08;Linear List&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见线性表&…

FastGPT 社区版快速部署指南

产品简介 FastGPT 是基于大语言模型的智能知识库系统&#xff0c;提供以下核心能力&#xff1a; ✅ 开箱即用 - 内置数据预处理、多模型对接、权限管理 ✅ 可视化编排 - 通过 Flow 工作流实现复杂问答逻辑设计 ✅ 多场景适配 - 支持客服机器人/知识检索/数据分析等场景 &…

【css酷炫效果】纯CSS实现科技感网格背景

【css酷炫效果】纯CSS实现科技感网格背景 缘创作背景html结构css样式完整代码基础版进阶版(3D光线扫描版) 效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;上传后更新 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&#xff0c;赶时间&a…

Android BLE 权限管理

前言 android 权限一直是比较活跃的 在蓝牙权限这一块又分新版和旧版 新版权限 android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_CONNECT旧版权限如9.0以下 Manifest.permission.A…

vue3:十一、主页面布局(左侧菜单折叠展开设置)

一、实现效果 二、基本实现 1、菜单容器增加展开收缩方法 在菜单容器中开启这个方法&#xff0c;值设置为一个变量 :collapseiscollapse 2、定义菜单收缩与否的变量 在js中初始化是否收缩的变量&#xff0c;初始值为不收缩(也就是展开) //左侧菜单展开与收缩 const iscolla…

Chapter 4-15. Troubleshooting Congestion in Fibre Channel Fabrics

show zone member: Shows the name of the zone to which a device belongs to. This command can be used to find the victims of a culprit device or vice versa. 显示设备所属的区域名称。该命令可用于查找罪魁祸首设备的受害者,反之亦然。 show zone active: Shows the…

使用 JDBC 插入数据并获取自动生成的主键(如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列) 的完整示例代码,包含详细注释

以下是使用 JDBC 插入数据并获取自动生成的主键&#xff08;如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列&#xff09; 的完整示例代码&#xff0c;包含详细注释&#xff1a; import java.sql.*;public class GeneratedKeysExample {// 数据库连接参数private static final St…

网络爬虫【爬虫库request】

我叫不三不四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲爬虫 Requests是Python的一个很实用的HTTP客户端库&#xff0c;完全满足如今网络爬虫的需求。与Urllib对比&#xff0c;Requests不仅具备Urllib的全部功能&#xff1b;在开发使用上&…

MTKAndroid12 解决SystemUI下拉框中,长按WIFI图标会导致崩溃问题

解决SystemUI下拉框中&#xff0c;长按WIFI图标会导致崩溃问题 文章目录 场景参考资料修改文件解决方案日志源码分析 总结 场景 在部分产品中偶发性发现&#xff0c; SystemUI下拉框下拉后长按WIFI图标会导致崩溃问题&#xff0c;有时候是截屏、点击Home 按键后&#xff0c;长…