日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM系列之:从汇编角度分析NullCheck

發布時間:2024/2/28 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM系列之:从汇编角度分析NullCheck 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • 一個普通的virtual call
  • 普通方法中的null check
  • 反優化的例子
  • 總結

簡介

之前我們在講Virtual call的時候有提到,virtual call方法會根據傳遞的參數實例的不同而進行優化,從而優化成為classic call,從而提升執行效率。

今天我們考慮一下,在virtual call中執行nullcheck的時候,如果已經知道傳遞的參數是非空的。JIT會對代碼進行優化嗎?

一起來看看吧。

一個普通的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看看運行結果:

先看第二個和第三個紅框,我們可以看到代碼先做了參數類型的比較,然后對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的判斷。

運行看下結果:

相比較而言,我們可以看到,代碼其實沒有太多的變化,說明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的結果:

看下結果有什么不同呢?

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

總結

JIT會根據不同的情況,對代碼進行不同程度的優化,希望大家能夠喜歡。

本文作者:flydean程序那些事

本文鏈接:http://www.flydean.com/jvm-assembly-nullcheck/

本文來源:flydean的博客

歡迎關注我的公眾號:程序那些事,更多精彩等著您!

總結

以上是生活随笔為你收集整理的JVM系列之:从汇编角度分析NullCheck的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。