溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何從Hotspot源碼層面剖析java多態(tài)實現(xiàn)原理

發(fā)布時間:2022-01-26 11:45:37 來源:億速云 閱讀:160 作者:柒染 欄目:開發(fā)技術(shù)

今天給大家介紹一下如何從Hotspot源碼層面剖析java多態(tài)實現(xiàn)原理。文章的內(nèi)容小編覺得不錯,現(xiàn)在給大家分享一下,覺得有需要的朋友可以了解一下,希望對大家有所幫助,下面跟著小編的思路一起來閱讀吧。

C++是如何實現(xiàn)多態(tài)的

多態(tài)的實現(xiàn),現(xiàn)在幾乎所有的編程語言都是基于虛表實現(xiàn)的,英文vtable。這里我沒有說全部,因為我也不是所有的語言都了解哈,不敢亂說,免得遭噴。^_^

C++的虛表在哪呢?在new創(chuàng)建的對象的頭部。虛表里面存儲的是什么呢?是虛函數(shù)。C++這塊的知識我就不講太多了,很多小伙伴不了解C++,講多了沒必要,作為一名Java程序員,了解到這個程度夠了。

如何從Hotspot源碼層面剖析java多態(tài)實現(xiàn)原理

因為hotshot主要是用C++寫的,講了C++的虛表,這張圖你應(yīng)該就能看懂了。

如何從Hotspot源碼層面剖析java多態(tài)實現(xiàn)原理

不然總有小伙伴問我:Java的類對應(yīng)的C++對象,為什么有C++級別的虛表啊。我沒看到哪里有這樣的代碼啊。

搞清楚了虛表,再來了解虛表分發(fā)就容易多了。虛表分發(fā),其實就是通過虛表內(nèi)存地址拿到虛表記錄,然后通過函數(shù)名+內(nèi)含參數(shù)信息及返回值信息的簽名去虛表中找。因為是從前往后找,所以如果子類重寫了父類的方法,會調(diào)用子類的方法。

C++的虛表分發(fā),我只是簡單講了下,講多了大家沒概念。JVM的虛表分發(fā),我等下會講得詳細(xì)一些。很多現(xiàn)象,如果不了解它的底層,是不是百思不得其解。有那么多為什么?為什么?^_^

所以Java雖好,底層也很重要。順便說下,虛表就是用數(shù)組實現(xiàn)的,沒有有些小伙伴想得那么復(fù)雜。

JVM中的虛表

JVM的虛表跟C++的虛表還不太一樣。不一樣體現(xiàn)在哪呢?研究虛表研究三個東西:虛表在哪、虛表是用什么結(jié)構(gòu)實現(xiàn)的、虛表分發(fā)機制是怎樣的。JVM的虛表分發(fā)等下講,JVM的虛表也是用數(shù)組實現(xiàn)的,那這個不一樣就體現(xiàn)在虛表在哪?

Java的類,JVM中對應(yīng)的C++對象是klass模型。Java的對象,JVM中對應(yīng)的C++對象是oop模型。C++中的虛表在對象頭中,而JVM的虛表在klass模型的頭部,即Java類對象的頭部。這點區(qū)別一定要記住,這樣你才能理解Java對象的內(nèi)存布局。

問個問題:我們隨便定義的一個類,它有沒有JVM虛表呢?其實是有的。那是哪些方法的內(nèi)存地址呢?回答這個問題前先得搞明白:什么樣的方法會存入虛表。只有public、protect類型的,且不被static、final修飾的方法才能被多態(tài)調(diào)用,才會進入虛表。因為Java中所有的類都是Object的子類,所以O(shè)bject中滿足這個條件的方法都會在每個類的虛表中。

又到了小伙伴不服氣環(huán)節(jié)。么事,上證據(jù)。具體怎么查看我就不講了,有點復(fù)雜。對hotspot沒一定的功力講了也沒概念。

如何從Hotspot源碼層面剖析java多態(tài)實現(xiàn)原理

Java是如何實現(xiàn)虛表分發(fā)

有些小伙伴不理解:我只會Java干活都沒問題呀,我為什么要學(xué)底層呢?那你想進大廠跟優(yōu)秀的人成為同事嗎?你想成為別人眼中的大佬嗎?你希望在某個領(lǐng)域能有一定的名氣嗎……這些都需要實力來支撐。

有些小伙伴說:我手寫一個JVM干什么呢?那我就用我手寫的JVM來講解這個知識點。這就是你有一個手寫JVM的意義之一。

JVM實現(xiàn)虛表分發(fā),對應(yīng)的字節(jié)碼指令有兩個:invokevirtual、invokeinterface。一看執(zhí)行invokeinterface時的堆棧,你應(yīng)該就能明白了。

如何從Hotspot源碼層面剖析java多態(tài)實現(xiàn)原理

雖然invokeinterface后面的操作數(shù)是接口方法信息。但是真正的對象會作為this傳過來。所以在調(diào)用的時候,從操作數(shù)棧拿到真正的對象,然后通過對象頭中的類型指針拿到TestDuotai對應(yīng)的C++類對象,即klass模型。前面說了,虛表就在這個對象的頭部。然后通過函數(shù)名+內(nèi)含參數(shù)信息及返回值信息的簽名去虛表中找。因為是從前往后找,所以如果子類重寫了父類的方法,會調(diào)用子類的方法。這就是JVM虛表分發(fā)的底層原理。

如何從Hotspot源碼層面剖析java多態(tài)實現(xiàn)原理

以上就是如何從Hotspot源碼層面剖析java多態(tài)實現(xiàn)原理的全部內(nèi)容了,更多與如何從Hotspot源碼層面剖析java多態(tài)實現(xiàn)原理相關(guān)的內(nèi)容可以搜索億速云之前的文章或者瀏覽下面的文章進行學(xué)習(xí)哈!相信小編會給大家增添更多知識,希望大家能夠支持一下億速云!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI