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

淺談JVM系列之從匯編角度分析NullCheck

 更新時(shí)間:2021年06月03日 09:24:53   作者:flydean  
在virtual call中執(zhí)行nullcheck的時(shí)候,如果已經(jīng)知道傳遞的參數(shù)是非空的。JIT會(huì)對(duì)代碼進(jìn)行優(yōu)化嗎?本文將詳細(xì)介紹JVM系列之從匯編角度分析NullCheck。

一個(gè)普通的virtual call

我們來分析一下在方法中調(diào)用list.add方法的例子:

public class TestNull {

    public static void main(String[] args) throws InterruptedException {
        List<String> list= new ArrayList();
	    list.add("www.flydean.com");
        for (int i = 0; i < 10000; i++)
        {
            testMethod(list);
        }
        Thread.sleep(1000);
    }
    private static void testMethod(List<String> list)
    {
        list.get(0);
    }
}

代碼很簡(jiǎn)單,我們?cè)谘h(huán)中調(diào)用testMethod方法,而這個(gè)方法里面又調(diào)用了list.get(0)方法,來獲取list的第一個(gè)參數(shù)。

單純的看testMethod,這個(gè)方法是有可能拋出NullPointerException的,但是從整體運(yùn)行的角度來看,因?yàn)槲覀兊膌ist是有值的, 所以不會(huì)拋出異常。

使用JIT Watcher看看運(yùn)行結(jié)果:

先看第二個(gè)和第三個(gè)紅框,我們可以看到代碼先做了參數(shù)類型的比較,然后對(duì)testMethod進(jìn)行了優(yōu)化,這里還可以看到get方法是內(nèi)聯(lián)到testMethod中的。

代碼優(yōu)化的部分我們找到了,那么異常處理呢?如果list為空,應(yīng)該怎么處理異常呢?

第一個(gè)紅框,大家可以看到是一個(gè)隱式的異常處理,它重定向到1152b4f01這個(gè)地址。

第四個(gè)紅框就是這地址,表示的是異常處理的代碼。

普通方法中的null check

我們?cè)谏厦娴钠胀ǚ椒ɡ锩婕由弦粋€(gè)null check:

public class TestNull1 {

    public static void main(String[] args) throws InterruptedException {
        List<String> list= new ArrayList();
        list.add("www.flydean.com");
        for (int i = 0; i < 10000; i++)
        {
            testMethod(list);
        }
        Thread.sleep(1000);
    }

    private static void testMethod(List<String> list)
    {
        if(list !=null ){
            list.get(0);
        }
    }
}

上面我們添加了一個(gè)list !=null的判斷。

運(yùn)行看下結(jié)果:

相比較而言,我們可以看到,代碼其實(shí)沒有太多的變化,說明JIT在代碼優(yōu)化的過程中,將null check優(yōu)化掉了。

那么null check到底在什么地方呢? 看我標(biāo)紅的第二個(gè)框,這里是之前的異常處理區(qū)域,我們可以看到里面有一個(gè)ifnull,表明這里做了null check。

反優(yōu)化的例子

上面的兩個(gè)例子,我們可以看出在virtual method中,JIT對(duì)null check進(jìn)行了優(yōu)化。接下來我們?cè)倏匆粋€(gè)例子,在這個(gè)例子中,我們顯示的傳遞一個(gè)null給testMethod,然后再次循環(huán)testMethod,如下所示。

for (int i = 0; i < 10000; i++)
{
    testMethod(list);
}
Thread.sleep(1000);
testMethod(null);
for (int i = 0; i < 10000; i++)
{
    testMethod(list);
}

我們看下JIT的結(jié)果:

看下結(jié)果有什么不同呢?

第一,ifnull現(xiàn)在是顯示調(diào)用的,并不包含在隱式異常中。
第二,隱式異常也不見了,因?yàn)槭褂蔑@示的ifnull。

以上就是淺談JVM系列之從匯編角度分析NullCheck的詳細(xì)內(nèi)容,更多關(guān)于JVM系列之從匯編角度分析NullCheck的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中的HashMap內(nèi)存泄漏問題詳解

    Java中的HashMap內(nèi)存泄漏問題詳解

    這篇文章主要介紹了Java中的HashMap內(nèi)存泄漏問題詳解,WeakHashMap中的key是弱引用,如果再使用之后沒有及時(shí)remove掉這個(gè)key,那么當(dāng)GC時(shí)key就可能會(huì)被回收,導(dǎo)致key對(duì)應(yīng)的value對(duì)象占用的內(nèi)存無法回收進(jìn)而導(dǎo)致內(nèi)存泄漏,需要的朋友可以參考下
    2023-09-09
  • JavaSwing后臺(tái)播放音樂mp3

    JavaSwing后臺(tái)播放音樂mp3

    這篇文章主要為大家詳細(xì)介紹了JavaSwing后臺(tái)播放音樂mp3,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • SpringBoot和Tomcat的關(guān)系解讀

    SpringBoot和Tomcat的關(guān)系解讀

    這篇文章主要介紹了SpringBoot和Tomcat的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 在SpringBoot中使用lombok的注意事項(xiàng)

    在SpringBoot中使用lombok的注意事項(xiàng)

    這篇文章主要介紹了在SpringBoot中使用lombok的注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • PowerJob分布式任務(wù)調(diào)度源碼流程解讀

    PowerJob分布式任務(wù)調(diào)度源碼流程解讀

    這篇文章主要為大家介紹了PowerJob分布式任務(wù)調(diào)度源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • MyBatis XML去除多余AND|OR前綴或逗號(hào)等后綴的操作

    MyBatis XML去除多余AND|OR前綴或逗號(hào)等后綴的操作

    這篇文章主要介紹了MyBatis XML去除多余AND|OR前綴或逗號(hào)等后綴的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java中DecimalFormat用法及符號(hào)含義

    Java中DecimalFormat用法及符號(hào)含義

    DecimalFormat是NumberFormat的一個(gè)具體子類,用于格式化十進(jìn)制數(shù)字。這篇文章介紹了DecimalFormat的用法及符號(hào)含義,需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12
  • SpringBoot中@PathVariable、@RequestParam和@RequestBody的區(qū)別和使用詳解

    SpringBoot中@PathVariable、@RequestParam和@RequestBody的區(qū)別和使用詳解

    這篇文章主要介紹了SpringBoot中@PathVariable、@RequestParam和@RequestBody的區(qū)別和使用詳解,@PathVariable 映射 URL 綁定的占位符,通過@RequestMapping注解中的{}占位符來標(biāo)識(shí)URL中的變量部分,需要的朋友可以參考下
    2024-01-01
  • 全面解析Spring Security 過濾器鏈的機(jī)制和特性

    全面解析Spring Security 過濾器鏈的機(jī)制和特性

    這篇文章主要介紹了Spring Security 過濾器鏈的機(jī)制和特性,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • IDEA教程創(chuàng)建SpringBoot前后端分離項(xiàng)目示例圖解

    IDEA教程創(chuàng)建SpringBoot前后端分離項(xiàng)目示例圖解

    在使用spring、mybatis等框架時(shí),配置文件很復(fù)雜,有時(shí)復(fù)雜的讓人想放棄Java,使用C#。springboot出現(xiàn)這一切問題就都不是問題
    2021-10-10

最新評(píng)論

巴东县| 星座| 青川县| 保靖县| 贡觉县| 基隆市| 太白县| 梓潼县| 水城县| 高青县| 密山市| 沁水县| 沈阳市| 开鲁县| 龙胜| 丹凤县| 高青县| 凤城市| 绍兴市| 杭锦后旗| 金门县| 故城县| 石河子市| 嘉义市| 来安县| 昭平县| 乌鲁木齐市| 万山特区| 天等县| 赫章县| 寻甸| 治县。| 黄平县| 黑龙江省| 兴化市| 建德市| 钟祥市| 柞水县| 嵊州市| 八宿县| 浦北县|