最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的方法內聯(lián)介紹

 更新時間:2022年01月28日 14:08:18   作者:pedro7  
大家好,本篇文章主要講的是Java中的方法內聯(lián)介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下

1. 什么是方法內聯(lián)

例如有下面的原始代碼:

static class B {
    int value;
    final int get() {
        return value;
    }
}

public void foo() {
    y = b.get();
    // ...do stuff...
    z = b.get();
    sum = y + z;
}

我們首先要進行的就是方法內聯(lián),主要有下面兩個目的:

去除方法調用的成本,如查找方法版本、建立棧幀。

為其他優(yōu)化建立良好基礎。

內聯(lián)后代碼如下:

public void foo() {
    y = b.value;
    // ...do stuff...
    z = b.value;
    sum = y + z;
}

后續(xù),還可以進行冗余訪問消除、復寫傳播、無用代碼消除等優(yōu)化操作。

2. 方法內聯(lián)的重要性

方法內聯(lián)是編譯器最重要的優(yōu)化手段,如果沒有內聯(lián),多數(shù)其他優(yōu)化都無法有效進行。例如下面這個例子:

public static void foo(Object obj){
    if (obj != null) {
        System.out.println("do something");
    }
}

public static void testInline(String[] args) {
    Object obj = null;
    foo(obj);
}

testInline()方法里其實全都是無用的代碼,但是如果不做方法內聯(lián),就無法發(fā)現(xiàn)任何 Dead Code 的存在,因為分開看的話兩個方法里面的操作可能都有意義。

3. Java中方法內聯(lián)的困難

在 JVM 中,只有非虛方法,也就是使用invokespecial指令調用的私有方法、實例構造器、父類方法和使用invokestatic指令調用的靜態(tài)方法才會在編譯器進行解析。

而其他虛方法被invokevirtual指令調用,在調用時必須進行方法接收者的多態(tài)選擇。對于一個虛方法,編譯器靜態(tài)地去做內聯(lián)的時候很難確定應該使用哪個方法版本,這就造成了方法內聯(lián)的困難。

繼承類型關系分析 CHA

首先,JVM 引入了一種名為類型繼承關系分析 CHA 的技術,這種技術用于在已加載的類中,確定某個接口是否有多于一種的實現(xiàn)、某個類是否存在子類、某個子類是否覆蓋了父類的某個虛方法等信息。

編譯器在進行內聯(lián)時會分不同情況采取不同處理:

如果是非虛方法,那么就直接進行內聯(lián)。

如果是虛方法,那么向 CHA 查詢是否有多個目標版本可供選擇。

如果只有一個版本,就直接內聯(lián),稱為守護內聯(lián)。但由于 Java 程序動態(tài)連接,不知道什么時候就會加載到新的類型而改變 CHA 的結論,所以要留好逃生門,假如程序后續(xù)執(zhí)行中加載了導致繼承關系發(fā)生變化的新類,那么必須拋棄已經編譯的代碼,退回到解釋狀態(tài)進行執(zhí)行,或者重新編譯。

如果有多個版本可供選擇,那即時編譯器使用內聯(lián)緩存來縮減方法調用的開銷。內聯(lián)緩存是一個建立在目標方法正常入口之前的緩存。在未發(fā)生方法調用時,內聯(lián)緩存為空。第一次調用發(fā)生后,緩存記錄下方法接收者的版本信息,并且在每次進行調用前都檢查版本。

如果每次調用的方法接收者版本是一樣的,那稱為單態(tài)內聯(lián)緩存,通過緩存來調用,相比不內聯(lián)只多了一次類型判斷的開銷。如果出現(xiàn)方法接收者不一致的情況,就退化為超多態(tài)內聯(lián)緩存,開銷相當于真正查找虛方法表來進行方法分派。當緩存未命中的時候,大多數(shù)JVM的實現(xiàn)時退化成超多態(tài)內聯(lián)緩存,也有一些JVM選擇重寫單態(tài)內聯(lián)緩存,就是更新緩存為新的版本。這樣做的好處是以后還可能會命中,壞處是可能白白浪費一個寫的開銷。

總結 

到此這篇關于Java中的方法內聯(lián)介紹的文章就介紹到這了,更多相關Java方法內聯(lián)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中l(wèi)ogback?自動刷新不生效的問題解決

    Java中l(wèi)ogback?自動刷新不生效的問題解決

    本文主要介紹了Java中l(wèi)ogback?自動刷新不生效的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • Java線程間通信不同步問題原理與模擬實例

    Java線程間通信不同步問題原理與模擬實例

    這篇文章主要介紹了Java線程間通信不同步問題,結合實例形式分析了java線程間通信不同步問題的原理并模擬實現(xiàn)了線程間通信不同步情況下的異常輸出,需要的朋友可以參考下
    2019-10-10
  • CountDownLatch同步工具類使用詳解

    CountDownLatch同步工具類使用詳解

    這篇文章主要為大家詳細介紹了CountDownLatch的使用說明,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • java實現(xiàn)微信App支付服務端

    java實現(xiàn)微信App支付服務端

    這篇文章主要為大家詳細介紹了java實現(xiàn)微信App支付服務端,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 淺談JAVA在項目中如何自定義異常

    淺談JAVA在項目中如何自定義異常

    今天給大家?guī)淼氖顷P于Java的相關知識,文章圍繞著JAVA在項目中如何自定義異常展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • java實現(xiàn)簡易飛機大戰(zhàn)

    java實現(xiàn)簡易飛機大戰(zhàn)

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡易飛機大戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • SpringBoot整合Mail發(fā)送郵件功能

    SpringBoot整合Mail發(fā)送郵件功能

    我們在網(wǎng)站上注冊賬號的時候一般需要獲取驗證碼,而這個驗證碼一般發(fā)送在你的手機號上還有的是發(fā)送在你的郵箱中,注冊,賬號密碼…都需要用到驗證,今天就演示一下如何用SpringBoot整合Mail發(fā)送郵箱
    2021-11-11
  • java通過cglib動態(tài)生成實體bean的操作

    java通過cglib動態(tài)生成實體bean的操作

    這篇文章主要介紹了java通過cglib動態(tài)生成實體bean的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 聊聊Java 中的線程中斷

    聊聊Java 中的線程中斷

    這篇文章主要介紹了Java 中的線程中斷的相關資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • java中File類的使用方法

    java中File類的使用方法

    本篇文章介紹了,在java中File類的使用方法。需要的朋友參考下
    2013-04-04

最新評論

鄢陵县| 额济纳旗| 栾城县| 宝兴县| 环江| 芜湖市| 金秀| 汾西县| 宣城市| 图片| 濉溪县| 五华县| 武清区| 五大连池市| 手游| 华容县| 余江县| 肥东县| 宜都市| 长沙县| 深圳市| 昌邑市| 瑞安市| 壶关县| 子长县| 枝江市| 清原| 阜康市| 德保县| 印江| 紫金县| 宁安市| 大理市| 廉江市| 呈贡县| 诏安县| 武功县| 饶河县| 灌阳县| 孝感市| 油尖旺区|