【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,這點我們在之前的文章中也說過了,感興趣的可以查看源碼自行了解。
將$1壓棧,加到虛擬機棧空間中。
invokevirtual調用System.out的println(),打印$1的值,輸出true。
getstatic再次獲取System.out
iload_2將$2壓棧,加到虛擬機棧空間中。
invokevirtual調用System.out的println(),打印$2的值,輸出false。
returnmain()返回值為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位。
結論
再思考: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的本质的虚拟机指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【软件工程】集成开发
- 下一篇: 【计算机网络】计算机网络概述