.class文件轉換.java_Java中的動態鏈接VS操作系統動態鏈接

在操作系統OS中為了優化內存的使用會采用一種動態鏈接方式,一個文件想要在操作系統中運行必須經過編譯、匯編譯、鏈接、裝載等步驟。可以參考Java程序是怎么跑起來的。本篇主要講解Java棧幀中動態鏈接部分與操作系統的的動態鏈接的區別與聯系

操縱系統為什么需要動態鏈接

OS是向下統一管理機器硬件、向上給各個應用程序提供統一的系統調用的程序。其中對內存的管理也是重頭戲,以下是32位Linux操作系統中虛擬內存的空間分配圖

1a390a9a2e5bd078b9b60e249a356316.png

每一個應用程序看到的內存就是這樣的一段虛擬內存空間。應用程序的代碼指令就存儲在.text段也叫代碼段,只讀。.data段也叫數據段用于存儲程序的靜態變量、全局變量,可讀可寫

在應用程序的運行中除了運行自身的代碼指令外還需要加載一些系統的公共庫,比如用于網絡收發的socket庫等。在windows中,這些共享庫以.dll(Dynamic-Link Libary 動態鏈接庫)結尾,在Linux中以.so(Shared Object)結尾。加載這些共享庫可進行對系統資源的調用

靜態鏈接

當應用程序代碼經歷鏈接過程生成可執行文件時,每鏈接一個共享庫就將共享庫代碼復制一份進應用程序的可執行文件中,因此有多少應用程序調用同一個共享庫文件,該共享庫文件中的代碼就在內存中加載多少份

動態鏈接

在沒用動態鏈接前,系統確實是采用靜態鏈接的方式鏈接共享庫,但是發現對內存的使用是一種極大的浪費,因此動態鏈接孕育而生。為了達到各個應用程序只加載同一個共享庫但內存只存在一份共享庫代碼,動態鏈接首先解決的技術問題是地址無關性

PLT、GOT表解決地址無關性

我們都知道程序代碼指令加載進內存的代碼段是可執行只讀的,無法動態的修改代碼指令。那么當共享庫載入內存中時是怎么被各個不同的應用程序找到的呢?

其實在應用程序的可執行文件加載進內存后,該程序的內存數據段(.data)存在一張GOT(Global Offset Table)全局偏移表,GOT表中,當有需要引用共享庫地址的方法指令,都會查詢 GOT,根據GOT表找到共享庫方法指令的地址位置并調用。因為GOT存在于數據段,因此當共享庫發生變化時,應用程序也不需要重新編譯,可以直接動態的改變GOT表中的虛擬內存,從而找到最新的共享庫。

共享庫載入實際的物理內存,雖然物理內存不會變,但是每個應用程序看到的虛擬內存不一樣,所以共享庫在不同的應用程序中的虛存地址是不一樣的,好在每個應用程序都擁有自己的GOT表,能夠準確的記錄了共享庫的位置。這也就達到了地址無關性。

PLT(Procedure Link Table)程序鏈接表存在于內存的代碼段中,主要是用于延遲綁定,我們可以將其理解為跳表。應用程序先是調用PLT表中查詢需要調用的GOT表的地址位置,跳到GOT表后查詢出共享庫的虛存,然后再去調用共享庫方法。因為很多動態裝載的函數庫都是不會被實際調用到的,而共享庫中存在非常多的函數,因此采用PLT可達到延遲加載。

像動態鏈接這樣通過修改“地址數據”來進行間接跳轉,去調用一開始不能確定位置代碼的思路,Java中的多態也采用了這種思想。

Java棧幀中的動態鏈接

以前的文章中解釋了棧幀(拆解棧幀中本地變量表),其中動態鏈接也是組成棧幀的一部分。在上面對OS的解釋中,動態鏈接是一種技術名稱,在Java棧幀這里怎么就成了一個實體了呢?其實根據Java虛擬機對動態鏈接的描述,翻譯成中文就是一個【引用】,那么棧幀存在的這個【引用】是干什么的呢?

在解釋這個【引用】的作用之前,還是先說明一點,Java棧幀中的動態鏈接的目的其實跟OS的是一樣的,都是為了節省內存空間,知道這個目的后我們再說明為什么可以節省。也因此在看JVM的時候,我總是會與OS做類比。

這個【引用】在虛機規范的解釋為指向運行時常量池的方法引用。每當棧幀中調用其他方法時都會存在一個【引用】。在.class文件中所有的變量和方法引用都是符號引用(Symbolic Reference)也就是下面字節碼中的 #數字。比如下面用javap反編譯的.class文件中的Constant pool。

public?class?com.ethan.chapter02.Test02LocalVariablesminor?version:?0major?version:?52flags:?ACC_PUBLIC,?ACC_SUPERConstant?pool:
???#1?=?Methodref??????????#7.#28?????????//?java/lang/Object."":()V
???#2?=?Class??????????????#29????????????//?com/ethan/chapter02/Test02LocalVariables
???#3?=?Methodref??????????#2.#28?????????//?com/ethan/chapter02/Test02LocalVariables."":()V
???#4?=?Methodref??????????#2.#30?????????//?com/ethan/chapter02/Test02LocalVariables.test3:()V
???#5?=?Long???????????????100l
???#7?=?Class??????????????#31????????????//?java/lang/Object
???#8?=?Utf8???????????????
???#9?=?Utf8???????????????()V
??#10?=?Utf8???????????????Code
??#11?=?Utf8???????????????LineNumberTable
??#12?=?Utf8???????????????LocalVariableTable
??#13?=?Utf8???????????????this
??#14?=?Utf8???????????????Lcom/ethan/chapter02/Test02LocalVariables;
??#15?=?Utf8???????????????main
??#16?=?Utf8???????????????([Ljava/lang/String;)V
??#17?=?Utf8???????????????args
??#18?=?Utf8???????????????[Ljava/lang/String;
??#19?=?Utf8???????????????variablesTable
??#20?=?Utf8???????????????num
??#21?=?Utf8???????????????I
??#22?=?Utf8???????????????test3
??#23?=?Utf8???????????????q
??#24?=?Utf8???????????????J
??#25?=?Utf8???????????????a
??#26?=?Utf8???????????????SourceFile
??#27?=?Utf8???????????????Test02LocalVariables.java
??#28?=?NameAndType????????#8:#9??????????//?"":()V
??#29?=?Utf8???????????????com/ethan/chapter02/Test02LocalVariables
??#30?=?NameAndType????????#22:#9?????????//?test3:()V
??#31?=?Utf8???????????????java/lang/Object
{public?com.ethan.chapter02.Test02LocalVariables();
????descriptor:?()V
????flags:?ACC_PUBLIC
????Code:
??????stack=1,?locals=1,?args_size=10:?aload_01:?invokespecial?#1??????????????????//?Method?java/lang/Object."":()V4:?return
??????LineNumberTable:
????????line?10:?0
??????LocalVariableTable:
????????Start??Length??Slot??Name???Signature0???????5?????0??this???Lcom/ethan/chapter02/Test02LocalVariables;public?static?void?main(java.lang.String[]);
????descriptor:?([Ljava/lang/String;)V
????flags:?ACC_PUBLIC,?ACC_STATIC
????Code:
??????stack=2,?locals=3,?args_size=10:?new???????????#2??????????????????//?class?com/ethan/chapter02/Test02LocalVariables3:?dup4:?invokespecial?#3??????????????????//?Method?"":()V7:?astore_18:?bipush????????1010:?istore_211:?aload_112:?invokevirtual?#4??????????????????//?Method?test3:()V15:?return
??????LineNumberTable:
????????line?12:?0
????????line?13:?8
????????line?14:?11
????????line?15:?15
??????LocalVariableTable:
????????Start??Length??Slot??Name???Signature0??????16?????0??args???[Ljava/lang/String;8???????8?????1?variablesTable???Lcom/ethan/chapter02/Test02LocalVariables;11???????5?????2???num???Ipublic?void?test3();
????descriptor:?()V
????flags:?ACC_PUBLIC
????Code:
??????stack=2,?locals=4,?args_size=10:?ldc2_w????????#5??????????????????//?long?100l3:?lstore_14:?bipush????????106:?istore_37:?return
??????LineNumberTable:
????????line?20:?0
????????line?21:?4
????????line?22:?7
??????LocalVariableTable:
????????Start??Length??Slot??Name???Signature0???????8?????0??this???Lcom/ethan/chapter02/Test02LocalVariables;4???????4?????1?????q???J7???????1?????3?????a???I
}

在.class文件中的常量池會隨著文件被加載而轉換進JVM中的運行時常量池中。由于存在了這些【符號引用】,可以使用Java層面的動態鏈接技術,將這些符號引用轉換為調用方法的直接引用。比如字節碼中的 invokevirtual指令就能夠支持動態鏈接。

在類加載子系統中,一個.class文件被加載進JVM共需要經歷3步驟,加載-鏈接-初始化。而在鏈接階段中的第三步【解析】的目的就是將常量池內的符號引用轉換為直接引用的過程,也就是動態鏈接產生的過程。

我們類比一下OS的動態鏈接與Java的動態鏈接。Java的.class文件類比于OS的每一個應用程序的可執行文件,.class文件中的常量池類比于GOT表,java的運行時常量池類比于共享庫。java產生動態的鏈接是在.class的解析階段,根據.class文件中的符號引用去查詢常量池然后,將.class文件中的符號引用轉換為直接應用,并存于棧幀中。

因為在加載不同的.class文件時,都可能調用相同的常量或者方法,所以只需要在運行時常量池存儲一份,然后記錄其直接引用即可,因此節省了空間。

解釋完Java層面的動態鏈接我們也就能解釋Java多態的實現過程了,在Java源代碼編譯期間方法的重寫導致無法確認出調用方法的真正位置,只有在運行時將符號引用轉為為直接應用采用確定方法的位置。這個過程也就是在【解析】階段實現的。

這種編譯時期無法確定方法的調用位置,只能夠在程序運行期根據實際的類型綁定相關方法,這種綁定方式也就被稱之為晚期綁定。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529610.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529610.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529610.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機組成原理與應用,計算機組成原理簡答與應用

簡答與應用1.何謂中斷??中斷是由外圍設備或其他非預期的急需處理的事件引起的,CPU暫時中斷正在執行的程序,轉至另一服務程序去處理這一事件,待事件處理完畢后返回原程序繼續執行。2.(不算CPU中的寄存器級)存…

宏觀經濟學gdp計算方法_宏觀經濟學考研的重要考點

宏觀經濟學考研重要考點西方國民收入核算宏觀經濟學的特點;國內生產總值;核算國民收入的兩種算法(支出法和收入法);國內生產總值;個人可支配收入;國民收入的基本公式;名義GDP和實際GDP。要求:重點掌握本章基本概念及計算。簡單國民收入決定理論均衡產出;凱恩斯的消費…

大學計算機基礎試題 選擇題,大學計算機基礎試題選擇題

大學計算機基礎試題選擇題第一章1. 世界上第一臺全自動電子數字計算機ENIAC的誕生時間是( )A. 1945年 B. 1946年 C. 1948年 D. 1949年2. 第一位提出“存儲程序”思想的科學家是( )A. 圖靈 B. 萊布尼茨 C. 馮諾伊曼 D. 帕斯卡3. 電子計算機四個發展階段的劃分依據是( )不同A. 電…

json符號解釋大全_牛年汪姓男孩高端大氣的名字大全

牛年汪姓男孩高端大氣的名字大全 張桉寧起名分享牛年汪姓男孩高端大氣的名字大全:給男孩起名有很多的講究,需要從多個方面考慮。牛年汪姓男孩如何起一個高端大氣的好名字,是家長朋友們都十分重視的。給牛年的汪姓男孩起一個高端的名字&#x…

變電站計算機在線監控系統,變電站環境在線監測系統

原標題:變電站環境在線監測系統概述隨著計算機技術、網絡通訊技術以及電力系統保護技術的發展,配電室的自動化運行水平不斷提高,大大減少了人為操作,使配電室的無人值守逐步變成了可能。配電的可靠和安全是整個電能管理系統中的一…

什么意思是誰_舔狗是什么意思?如果不是真的喜歡誰又愿意做舔狗呢出處?

[海峽網]網絡上面經常會出現一些新的詞句,比如最近舔狗這個詞就經常出現在大家的視線中。相信很多小伙伴都知道,最近關于虎牙的包子的事情也是挺多的,不過關于包桑的梗也是很多,那么關于包桑的這句“如果不是真的喜歡,…

計算機控制面板圖標顯示,Win8桌面如何有計算機/控制面板圖標

Win8桌面如何有計算機/控制面板圖標2013年06月04日 00:44作者:馬承平編輯:馬承平文章出處:泡泡網原創分享泡泡網系統工具頻道6月4日 全新Windows8系統給我們帶來不僅是超炫的動態磁貼展示,更有新增超級按鈕項,它大大集…

【Android 13】使用Android Studio調試系統應用之Settings移植(二):構建settings app項目目錄

文章目錄 一、篇頭二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、準備工作3.1 創建目錄3.2 初始化 git 倉庫四、提取settings原始代碼4.1 提取目標4.2 源碼路徑4.2.1 settings app4.2.2 SettingsLib4.3 存放位置

dog log 算子_DoG和LoG算子

DoG(Difference of Gaussian)算子和LoG(Laplacian of Gaussian)算子是常用的極值點檢測(Blob Detection)兩種方法,高斯卷積是為了進行尺度變換,那么LapLacian呢。 因此這里首先引入LapLacian算子。圖像邊緣檢測因此進行邊緣檢測有兩種方法。一階導數的極…

計算機專業好還是鐵道運輸管理好,鐵道運輸管理專業主要是干什么的?

鐵道運輸管理專業主要是干什么的?鐵道運輸管理專業主要學什么?學鐵道運營管理好就業嗎?1、鐵道交通運營管理專業主要培養德、智、體、美各方面全面發展,掌握所必需的基本理論和專業知識,有較高的綜合素質和較強的鐵道交通運營管理…

大學期末考java編程題_大學java期末考試考試題和答案

題號一二三總分得分得分評卷人一、簡單編程題<共50分)在考試文件夾中新建一個應用程序proj1<應用程序的文件夾名稱為proj1)&#xff0c;按照以下要求編寫程序代碼。b5E2RGbCAP1.在程序中定義Person類&#xff0c;為該類編寫如下字段、構造器、訪問器、修改器和相應的其他…

計算機一級辦公軟件選擇題,計算機一級MSOffice習題

2018年計算機等級考試即將開始&#xff0c;出國留學網為考生們整理了2018年計算機一級MSOffice習題答案&#xff0c;希望能幫到大家&#xff0c;想了解更多資訊&#xff0c;請關注小編的及時更新哦。2018年計算機一級MSOffice習題答案(7)第1章 計算機基礎知識1.3 多媒體簡介1[…

51單片機基本刷屏測試實驗_51單片機開發基礎8——實時時鐘實驗

8.1 實時時鐘簡介RTC(Real Time Clock)&#xff0c;是實時時鐘的縮寫&#xff0c;實時時鐘是日常生活中應用最為廣泛的功能。它為人們提供精確的實時時間&#xff0c;或者為電子系統提供精確的時間基準&#xff0c;目前實時時鐘芯片大多采用精度較高的晶體振蕩器作為時鐘源。有…

湖南省普通高等學校計算機應用水平,湖南省普通高等學校非計算機專業學生計算機應用水平二級考試大綱...

湖南省普通高等學校非計算機專業學生計算機應用水平二級考試大綱考試要求:1.掌握計算機的基礎知識和網絡知識2.正確理解微機及其操作系統的基本功能&#xff0c;熟練掌握常用操作系統的使用3.具有使用微機系統常用應用軟件的基本能力4.掌握使用計算機網絡獲娶傳輸、發布信息的基…

tensorflow超參數優化_機器學習模型的超參數優化

引言模型優化是機器學習算法實現中最困難的挑戰之一。機器學習和深度學習理論的所有分支都致力于模型的優化。機器學習中的超參數優化旨在尋找使得機器學習算法在驗證數據集上表現性能最佳的超參數。超參數與一般模型參數不同&#xff0c;超參數是在訓練前提前設置的。舉例來說…

南充一中計算機機房被盜,四川省CCF CSP-JS第一輪認證考試在南充一中成功舉行...

10月11日&#xff0c;參加四川省青少年信息技術非專業級軟件能力認證(CSP-JS)第一輪認證考試的來自遂寧市、南充市、達州市的220名參與認證的選手齊聚南充一中。軟件能力認證(Certified Software Professional&#xff0c;簡稱CSP)&#xff0c;是由中國計算機學會舉辦&#xff…

java游戲猿人時代_猿人時代增值版_JAVA游戲免費版下載_7723手機游戲[www.7723.cn]

快速搜索機型:諾基亞 N70系列(176208)7610 3230 6600 6260 6620 6630 6670 6680 6681 6682 N70 N72 ;松下: X700 X800 ;聯想: P930諾基亞 N73系列(240320)N73 5320 5320XM 5320di_XM 5630XM 5700 5700XM 5710XM 5730XM 6110 6110N 6120 6120C 6120ci 6121 6122C 6124C 6210S 62…

軟件測試瀏覽器的上傳功能,關于瀏覽器上傳控件的識別 - asoqa的個人空間 - 51Testing軟件測試網 51Testing軟件測試網-軟件測試人的精神家園...

1&#xff1a;基本的上傳控件(圖1、圖2)圖1&#xff1a;MSN上傳照片圖2&#xff1a;ogame論壇上傳圖片這種基本的上傳控件QTP腳本在處理時有兩種方式&#xff1a;1.1 識別Windows選擇框對象Dialog和WinListView&#xff0c;有點繁瑣&#xff0c;但是能精確的定位用戶操作。Brow…

串燈控制盒去掉怎么接_單雙向可控硅好壞怎么判斷

大功率可控硅好壞判斷單向可控硅的工作原理&#xff1a; 可控硅導通條件&#xff1a;一是可控硅陽極與陰極間必須加正向電壓&#xff0c;二是控制極也要加正向電壓。以上兩個條件 單向可控硅的工作原理圖&#xff3b;1&#xff3d;必須同時具備&#xff0c;可控硅才會處于導通狀…

江西小學計算機說課稿,2019江西教師招聘面試-小學數學-說課稿

教師招聘面試-小學數學-說課稿——《分數的基本性質》尊敬的各位考官大家好&#xff0c;我是今天的X號考生&#xff0c;今天我說課的題目是《分數的基本性質》新課標指出&#xff1a;數學課程要面向全體學生&#xff0c;適應學生個性發展的需要&#xff0c;使得人人都能獲得良好…