欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1. 什么是方法內(nèi)聯(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;
}

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

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

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

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

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

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

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

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

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()方法里其實(shí)全都是無(wú)用的代碼,但是如果不做方法內(nèi)聯(lián),就無(wú)法發(fā)現(xiàn)任何 Dead Code 的存在,因?yàn)榉珠_(kāi)看的話兩個(gè)方法里面的操作可能都有意義。

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

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

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

繼承類型關(guān)系分析 CHA

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

編譯器在進(jìn)行內(nèi)聯(lián)時(shí)會(huì)分不同情況采取不同處理:

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

如果是虛方法,那么向 CHA 查詢是否有多個(gè)目標(biāo)版本可供選擇。

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

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

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

總結(jié) 

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

相關(guān)文章

  • MybatisPlus EntityWrapper如何自定義SQL

    MybatisPlus EntityWrapper如何自定義SQL

    這篇文章主要介紹了MybatisPlus EntityWrapper如何自定義SQL,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java實(shí)現(xiàn)高效PDF文件傳輸技巧

    Java實(shí)現(xiàn)高效PDF文件傳輸技巧

    你是否曾為PDF文件傳輸?shù)牡托识鄲??現(xiàn)在,有了這份Java實(shí)現(xiàn)高效PDF文件傳輸技巧指南,你將能夠輕松解決這個(gè)問(wèn)題,我們將分享一些實(shí)用的技巧和最佳實(shí)踐,幫助你優(yōu)化文件傳輸過(guò)程,不要錯(cuò)過(guò)這個(gè)提高工作效率的機(jī)會(huì),快來(lái)閱讀這份指南吧!
    2024-03-03
  • Spring Boot 中application.yml與bootstrap.yml的區(qū)別

    Spring Boot 中application.yml與bootstrap.yml的區(qū)別

    其實(shí)yml和properties文件是一樣的原理,且一個(gè)項(xiàng)目上要么yml或者properties,二選一的存在。這篇文章給大家介紹了Spring Boot 中application.yml與bootstrap.yml的區(qū)別,感興趣的朋友一起看看吧
    2018-04-04
  • Mybatis?如何開(kāi)啟控制臺(tái)打印sql語(yǔ)句

    Mybatis?如何開(kāi)啟控制臺(tái)打印sql語(yǔ)句

    這篇文章主要介紹了Mybatis?如何開(kāi)啟控制臺(tái)打印sql語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java在算法題中的輸入問(wèn)題實(shí)例詳解

    Java在算法題中的輸入問(wèn)題實(shí)例詳解

    在校招筆試中,有的時(shí)候我們要自己設(shè)計(jì)輸入輸出,所以下面這篇文章主要給大家介紹了關(guān)于Java在算法題中的輸入問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • 深入剖析Java編程中的序列化

    深入剖析Java編程中的序列化

    這篇文章主要介紹了深入剖析Java編程中的序列化,文中談到了序列化時(shí)對(duì)象的繼承等各種問(wèn)題,案例詳盡,強(qiáng)烈推薦!需要的朋友可以參考下
    2015-07-07
  • Java 的雙重分發(fā)與 Visitor 模式實(shí)例詳解

    Java 的雙重分發(fā)與 Visitor 模式實(shí)例詳解

    這篇文章主要介紹了Java 的雙重分發(fā)與 Visitor 模式實(shí)例詳解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • Java中的static關(guān)鍵字全面解析

    Java中的static關(guān)鍵字全面解析

    這篇文章主要介紹了Java中的static關(guān)鍵字全面解析的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • Java Socket通信(一)之客戶端程序 發(fā)送和接收數(shù)據(jù)

    Java Socket通信(一)之客戶端程序 發(fā)送和接收數(shù)據(jù)

    對(duì)于Socket通信簡(jiǎn)述,服務(wù)端往Socket的輸出流里面寫東西,客戶端就可以通過(guò)Socket的輸入流讀取對(duì)應(yīng)的內(nèi)容,Socket與Socket之間是雙向連通的,所以客戶端也可以往對(duì)應(yīng)的Socket輸出流里面寫東西,然后服務(wù)端對(duì)應(yīng)的Socket的輸入流就可以讀出對(duì)應(yīng)的內(nèi)容
    2016-03-03
  • 基于ReentrantLock的實(shí)現(xiàn)原理講解

    基于ReentrantLock的實(shí)現(xiàn)原理講解

    這篇文章主要介紹了ReentrantLock的實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論