中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JVM系列之從匯編角度分析NullCheck的示例分析

發布時間:2021-06-04 10:38:09 來源:億速云 閱讀:91 作者:小新 欄目:開發技術

這篇文章主要介紹了JVM系列之從匯編角度分析NullCheck的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一個普通的virtual call

我們來分析一下在方法中調用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);
    }
}

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

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

使用JIT Watcher看看運行結果:

JVM系列之從匯編角度分析NullCheck的示例分析

先看第二個和第三個紅框,我們可以看到代碼先做了參數類型的比較,然后對testMethod進行了優化,這里還可以看到get方法是內聯到testMethod中的。

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

第一個紅框,大家可以看到是一個隱式的異常處理,它重定向到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的判斷。

運行看下結果:

JVM系列之從匯編角度分析NullCheck的示例分析

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

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

反優化的例子

上面的兩個例子,我們可以看出在virtual method中,JIT對null check進行了優化。接下來我們再看一個例子,在這個例子中,我們顯示的傳遞一個null給testMethod,然后再次循環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的結果:

JVM系列之從匯編角度分析NullCheck的示例分析

看下結果有什么不同呢?

第一,ifnull現在是顯示調用的,并不包含在隱式異常中。
第二,隱式異常也不見了,因為使用顯示的ifnull。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“JVM系列之從匯編角度分析NullCheck的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jvm
AI

天峨县| 高陵县| 黄冈市| 洛南县| 苗栗县| 西畴县| 虞城县| 鸡西市| 阿合奇县| 澄江县| 江陵县| 通州市| 治多县| 苏州市| 策勒县| 峨山| 余江县| 石棉县| 桃园县| 禄劝| 建平县| 富锦市| 文水县| 宜兴市| 青田县| 东丰县| 阳城县| 陇南市| 道孚县| 南康市| 静海县| 昂仁县| 武城县| 隆林| 霞浦县| 峨边| 淳安县| 广汉市| 永和县| 庆云县| 芒康县|