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.pswp.cn/news/898761.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898761.shtml
英文地址,請注明出處:http://en.pswp.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;長…