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

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

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

一個普通的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);
    }
}

代碼很簡單,我們在循環(huán)中調(diào)用testMethod方法,而這個方法里面又調(diào)用了list.get(0)方法,來獲取list的第一個參數(shù)。

單純的看testMethod,這個方法是有可能拋出NullPointerException的,但是從整體運行的角度來看,因為我們的list是有值的, 所以不會拋出異常。

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

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

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

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

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

普通方法中的null check

我們在上面的普通方法里面加上一個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);
        }
    }
}

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

運行看下結(jié)果:

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

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

反優(yōu)化的例子

上面的兩個例子,我們可以看出在virtual method中,JIT對null check進(jìn)行了優(yōu)化。接下來我們再看一個例子,在這個例子中,我們顯示的傳遞一個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)用的,并不包含在隱式異常中。
第二,隱式異常也不見了,因為使用顯示的ifnull。

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

相關(guān)文章

  • seata-1.4.0安裝及在springcloud中使用詳解

    seata-1.4.0安裝及在springcloud中使用詳解

    這篇文章主要介紹了seata-1.4.0安裝及在springcloud中使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java-IO流實驗

    Java-IO流實驗

    流是一種抽象概念,它代表了數(shù)據(jù)的無結(jié)構(gòu)化傳遞。。用來進(jìn)行輸入輸出操作的流就稱為IO流。換句話說,IO流就是以流的方式進(jìn)行輸入輸出,希望能給您帶來幫助
    2021-06-06
  • 一文帶你探索Java中的通配符與泛型

    一文帶你探索Java中的通配符與泛型

    Java 語言中的泛型是一種強大的特性,它可以將類型參數(shù)化,使得代碼更具通用性和安全性,本文將深入講解 Java 通配符和泛型,有需要的小伙伴可以了解下
    2023-12-12
  • Java中Runnable和Thread的區(qū)別分析

    Java中Runnable和Thread的區(qū)別分析

    在java中可有兩種方式實現(xiàn)多線程,一種是繼承Thread類,一種是實現(xiàn)Runnable接口,下面就拉分別介紹一下這兩種方法的優(yōu)缺點
    2013-03-03
  • SpringSecurity+OAuth2.0?搭建認(rèn)證中心和資源服務(wù)中心流程分析

    SpringSecurity+OAuth2.0?搭建認(rèn)證中心和資源服務(wù)中心流程分析

    OAuth?2.0?主要用于在互聯(lián)網(wǎng)上安全地委托授權(quán),廣泛應(yīng)用于身份驗證和授權(quán)場景,這篇文章介紹SpringSecurity+OAuth2.0?搭建認(rèn)證中心和資源服務(wù)中心,感興趣的朋友一起看看吧
    2024-01-01
  • 淺入淺出的講解Spring循環(huán)依賴問題

    淺入淺出的講解Spring循環(huán)依賴問題

    循環(huán)依賴其實就是循環(huán)引用,也就是兩個或則兩個以上的bean互相持有對方,最終形成閉環(huán),下面這篇文章主要給大家介紹了關(guān)于Spring循環(huán)依賴問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • 在navicat中導(dǎo)入mysql數(shù)據(jù)庫詳細(xì)步驟(即.sql后綴的數(shù)據(jù)庫)

    在navicat中導(dǎo)入mysql數(shù)據(jù)庫詳細(xì)步驟(即.sql后綴的數(shù)據(jù)庫)

    Navicat是MySQL非常好用的可視化管理工具,功能非常強大,能滿足我們?nèi)粘?shù)據(jù)庫開發(fā)的所有需求,下面這篇文章主要給大家介紹了關(guān)于如何在navicat中導(dǎo)入mysql數(shù)據(jù)庫(即.sql后綴的數(shù)據(jù)庫)的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • SpringBoot集成WebSocket遇到的問題及解決

    SpringBoot集成WebSocket遇到的問題及解決

    這篇文章主要介紹了SpringBoot集成WebSocket遇到的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。
    2023-07-07
  • Spring Event事件通知機制解讀

    Spring Event事件通知機制解讀

    這篇文章主要介紹了Spring Event事件通知機制解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • java同步器AQS架構(gòu)AbstractQueuedSynchronizer原理解析下

    java同步器AQS架構(gòu)AbstractQueuedSynchronizer原理解析下

    這篇文章主要為大家介紹了java同步器AQS架構(gòu)AbstractQueuedSynchronizer原理解析下,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03

最新評論