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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【JVM】javap命令行分析揭示boolean的本质的虚拟机指令

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【JVM】javap命令行分析揭示boolean的本质的虚拟机指令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

源代碼

public class BooleanTest {public static void main(String[] args) {boolean a = true;boolean b = false;System.out.println(a);System.out.println(b);} }

編譯

>javac BooleanTest.java

執行

>java BooleanTest true false

反匯編

>javap -c BooleanTest Compiled from "BooleanTest.java" public class BooleanTest {public BooleanTest();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: iconst_11: istore_12: iconst_03: istore_24: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;7: iload_18: invokevirtual #3 // Method java/io/PrintStream.println:(Z)V11: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;14: iload_215: invokevirtual #3 // Method java/io/PrintStream.println:(Z)V18: return }

main()的虛擬機指令分析

iconst_1

上面的指令表示先生成一個常量,值為1,實際上是true。

istore_1

上面的指令表示將常量1賦值給第一個變量(在jshell里就是$1)

iconst_0

上面的指令表示先生成一個常量,值為0,實際上是false。

istore_2

上面的指令表示將常量0賦值給第二個變量(在jshell里就是$2)

getstatic

由于System.out.println()其中的System.out其實是java.lang.System中的一個靜態的屬性,所以這個指令顧名思義,就是獲取這樣一個靜態屬性。
這個System.out的類型其實是java.io.PrintStream,這點我們在之前的文章中也說過了,感興趣的可以查看源碼自行了解。

iload_1

將$1壓棧,加到虛擬機棧空間中。

invokevirtual

調用System.out的println(),打印$1的值,輸出true。

getstatic

再次獲取System.out

iload_2

將$2壓棧,加到虛擬機棧空間中。

invokevirtual

調用System.out的println(),打印$2的值,輸出false。

return

main()返回值為void,使用return結束方法,相當于C/C++中int main()最后的return 0。

深入探討boolean字節數

引自——http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html的說明:

boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its “size” isn’t something that’s precisely defined.

【翻譯】
布爾值:布爾數據類型只有兩個可能的值:true和false。 將此數據類型用于跟蹤真/假條件的簡單標志。 此數據類型代表一小部分信息,但其“大小”并不是精確定義的。

其實學過C語言的大家也知道,C中沒有boolean/bool這種類型的變量,只需要使用0/1即可,經過測試我們也知道,哪有boolean這種東西啊?計算機中所有的運算都是0/1序列,怎么存在真正的boolean?

同樣的,既然本身不存在,那其占用空間與實現方式有關,而實現方式由編譯器、虛擬機等決定。

《Java虛擬機規范》書中說到:
雖然定義了boolean這種數據類型,但是只對它提供了非常有限的支持。在Java虛擬機中沒有任何供boolean值專用的字節碼指令,Java語言表達式所操作的boolean值,在編譯之后都使用Java虛擬機中的int數據類型來代替,而boolean數組將會被編碼成Java虛擬機的byte數組,每個元素boolean元素占8位。

結論

  • boolean類型實際不存在,在JVM中使用0/1表示false/true。
  • boolean類型占用字節數沒有被規定,這與編譯器、虛擬機等有關。
  • boolean類型在規范標準的虛擬機中占4個字節;但規定boolean數組中每一個boolean使用1個字節的byte表示以節約空間。(所以說,網傳1字節特別是1bit的,基本認定是騙人的)
  • 再思考:4字節/1字節?

    Java有四種整數類型,byte(1 bit)、short(2 bits)、int(4 bits)、long(8 bits)。

    已知boolean就是使用0/1整數表示的前提下,使用byte表示boolean可以節約空間,這對于長數組或者大規模多維數組來說還是挺重要的。

    而使用int表示普通boolean,看似消耗了更多的空間,但實際上考慮到在32位/64位的機器上進行運算,int顯然更方便一些,對計算本身很友好。

    這種選擇正是體現了計算機科學中的“Trade Off”,我在很多文章里都提到過,很orz這個詞。我們還是要在不完美中選擇最適合具體情況的最優解啊orz。

    總結

    以上是生活随笔為你收集整理的【JVM】javap命令行分析揭示boolean的本质的虚拟机指令的全部內容,希望文章能夠幫你解決所遇到的問題。

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