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

Java為何需要平衡方法調(diào)用與內(nèi)聯(lián)

 更新時間:2021年01月29日 14:40:54   作者:干貨滿滿張哈希  
這篇文章主要介紹了Java為何需要平衡方法調(diào)用與內(nèi)聯(lián),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

在 Java 中,方法調(diào)用一般通過 Virtual Call 還有 Classic Call。

Classic Call 就是直接指向方法的地址,需要一次尋址到方法的地址,比直接執(zhí)行代碼慢。

Virtual Call 需要通過 VMT(Virtual Method Table)。這個VMT存儲的是該class對象中所有的Virtual Method,程序運(yùn)行的時候首先加載實例對象,然后通過實例對象找到VMT,通過VMT再找到對應(yīng)的方法地址,再執(zhí)行代碼。所以比 Classic Call 更慢。

Java 中除了 static 方法,private 方法以及構(gòu)造器是 Classic Call 之外,基本都是 Virtual Call。

為了優(yōu)化,JVM 運(yùn)行時,JVM使用混合模式來從字節(jié)碼轉(zhuǎn)換成機(jī)器可以運(yùn)行的機(jī)器碼,混合模式包括解釋器和JIT:

解釋器工作機(jī)制:

在編譯時,主要是將java源代碼文件編譯為java統(tǒng)一的字節(jié)碼,但是編譯成的字節(jié)碼并不能直接運(yùn)行,而是通過JVM讀取運(yùn)行。JVM中的解釋器就是將.class文件一行一行翻譯之后再運(yùn)行,翻譯就是轉(zhuǎn)換成當(dāng)前機(jī)器可以運(yùn)行的機(jī)器碼,它不會一次性把整個文件都翻譯過來,而是翻譯一句,執(zhí)行一句,再翻譯,再執(zhí)行,所以解釋器的程序運(yùn)行起來會比較慢,每次都要解釋之后再執(zhí)行。所以,有些時候,我們想是否可以把解釋之后的內(nèi)容緩存起來,這樣不就可以直接運(yùn)行了?但是,如果每段代碼都要緩存起來,例如僅僅執(zhí)行一次的代碼也緩存起來,這樣太浪費(fèi)內(nèi)存了。所以,引入一個新的運(yùn)行時編譯器,JIT來解決這些問題,加速熱點(diǎn)代碼的執(zhí)行。

JIT運(yùn)行時編譯器工作機(jī)制: 

JIT針對熱點(diǎn)代碼,進(jìn)行編譯與深度優(yōu)化,優(yōu)化后的機(jī)器碼會被緩存起來,存入CodeCache(代碼高速緩存)中。對于非熱點(diǎn)代碼,例如只運(yùn)行一次的代碼(類構(gòu)造器等等),直接解釋執(zhí)行,更加快速。JIT不僅花更多時間去編譯優(yōu)化,而且還多耗費(fèi)了很多內(nèi)存。字節(jié)碼轉(zhuǎn)換為可執(zhí)行的機(jī)器碼,大小會大很多很多倍。這也是為啥,解釋器每次都要翻譯并且執(zhí)行,JIT只針對熱點(diǎn)代碼進(jìn)行編譯優(yōu)化的原因。JIT編譯器執(zhí)行的一些常見優(yōu)化操作包括數(shù)據(jù)分析,從堆棧操作到寄存器操作的轉(zhuǎn)換,通過寄存器分配減少內(nèi)存訪問,消除常見子表達(dá)式等。JIT編譯器進(jìn)行的優(yōu)化程度越高,在執(zhí)行階段花費(fèi)的時間越多。因此,JIT編譯器無法承擔(dān)所有靜態(tài)編譯器所做的優(yōu)化,這不僅是因為增加了執(zhí)行時間的開銷,而且還因為它只對程序進(jìn)行了限制。這也就解釋了為什么有些JVM會選擇不總是做JIT編譯,而是選擇用解釋器+JIT編譯器的混合執(zhí)行引擎。

JIT其中一項很重要的優(yōu)化就是內(nèi)聯(lián): 內(nèi)聯(lián)是將較小方法的樹合并或“內(nèi)聯(lián)”到其調(diào)用者的樹中的過程。這樣可以加速頻繁執(zhí)行的方法調(diào)用。不同分層優(yōu)化階段,使用的算法不同。主要包括:

  • Trivial方法內(nèi)聯(lián)
  • 調(diào)用圖內(nèi)聯(lián)
  • 尾部遞歸消除
  • 虛擬調(diào)用優(yōu)化

這樣省略了 calling method。但是,如果將所有方法都內(nèi)聯(lián)的話,編譯出來的機(jī)器碼會很大很大,內(nèi)存占用會急劇增高,效率低下。所以,需要 JIT 把握好這個優(yōu)化的度

總結(jié)起來就是:JIT 是即時優(yōu)化并編譯代碼,優(yōu)化代碼包括內(nèi)聯(lián),編譯后的代碼保存在內(nèi)存中,也就是代碼高速緩存,編譯后的代碼是很大的,所以不能所有代碼都編譯,需要是熱點(diǎn)代碼。并且,內(nèi)聯(lián)也會將這個方法變得更大。代碼高速緩存也是需要清理的,代碼高速緩存占用過高,也會增加清理概率,因為你可能幾個方法都是高頻執(zhí)行,但是編譯之后占用過大導(dǎo)致超過代碼高速緩存限制,那么會發(fā)生代碼高速緩存清理,就是代碼緩存中的編譯代碼一直在換。清理代碼高速緩存,會讓所有線程進(jìn)入 Safepoint,然后才能清理,也就是 stop the world。內(nèi)聯(lián)過多,方法變大,這種清理頻率也會變大。

以上就是Java為何需要平衡方法調(diào)用與內(nèi)聯(lián)的詳細(xì)內(nèi)容,更多關(guān)于Java 平衡方法調(diào)用與內(nèi)聯(lián)的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:

相關(guān)文章

  • Java 添加、讀取和刪除 Excel 批注的操作代碼

    Java 添加、讀取和刪除 Excel 批注的操作代碼

    這篇文章主要介紹了Java 添加、讀取和刪除 Excel 批注的操作方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • springboot 事件監(jiān)聽的實現(xiàn)方法

    springboot 事件監(jiān)聽的實現(xiàn)方法

    這篇文章主要介紹了springboot 事件監(jiān)聽的實現(xiàn)方法,并詳細(xì)的介紹了四種監(jiān)聽方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • java中如何實現(xiàn)對類的對象進(jìn)行排序

    java中如何實現(xiàn)對類的對象進(jìn)行排序

    在本篇文章里小編給各位整理一篇關(guān)于java中如何實現(xiàn)對類的對象進(jìn)行排序知識點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • Springboot如何加載靜態(tài)圖片

    Springboot如何加載靜態(tài)圖片

    這篇文章主要介紹了Springboot如何加載靜態(tài)圖片,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring boot中Jackson的操作指南

    Spring boot中Jackson的操作指南

    這篇文章主要給大家介紹了關(guān)于Spring boot中Jackson操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • logback如何自定義日志存儲

    logback如何自定義日志存儲

    這篇文章主要介紹了logback如何自定義日志存儲的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • GSON實現(xiàn)Java對象的JSON序列化與反序列化的實例教程

    GSON實現(xiàn)Java對象的JSON序列化與反序列化的實例教程

    GSON是Google開發(fā)并開源的一個Java的JSON轉(zhuǎn)換庫,這里我們將來講解GSON實現(xiàn)Java對象的JSON序列化與反序列化的實例教程,需要的朋友可以參考下
    2016-06-06
  • Java中BigDecimal與0比較的一個坑實戰(zhàn)記錄

    Java中BigDecimal與0比較的一個坑實戰(zhàn)記錄

    BigDecimal屬于大數(shù)據(jù),精度極高,不屬于基本數(shù)據(jù)類型,屬于java對象,下面這篇文章主要給大家介紹了關(guān)于Java中BigDecimal與0比較的一個坑的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • java控制臺實現(xiàn)學(xué)生管理系統(tǒng)

    java控制臺實現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java控制臺實現(xiàn)簡單的學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java中LocalDateTime的具體用法

    Java中LocalDateTime的具體用法

    本文主要介紹了Java中LocalDateTime的具體用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評論

上杭县| 巴楚县| 连城县| 镇赉县| 石嘴山市| 包头市| 商都县| 东山县| 延津县| 连云港市| 阳泉市| 满城县| 宣威市| 辽阳市| 红河县| 宝坻区| 微山县| 屏山县| 镇安县| 杭州市| 高邑县| 兴义市| 德令哈市| 淮安市| 澄江县| 密云县| 利辛县| 枣庄市| 荆门市| 仙游县| 天长市| 勃利县| 军事| 襄樊市| 东海县| 望谟县| 慈溪市| 平远县| 丹东市| 甘南县| 隆林|