類型 | 意義 | 取值 |
---|---|---|
boolean | 布爾值 | true或false |
byte | 8位有符號整型 | -128~127 |
short | 16位有符號整型 | -pow(2,15)~pow(2,15)-1 |
int | 32位有符號整型 | -pow(2,31)~pow(2,31)-1 |
long | 64位有符號整型 | -pow(2,63)~pow(2,63)-1 |
float | 32位浮點數 | IEEE754標準單精度浮點數 |
double | 64位浮點數 | IEEE754標準雙精度浮點數 |
char | 字符型 | 16位不帶符號,Unicode字符 |
typedef unsigned char jboolean;
typedef signed char jbyte;
typedef short jshort;
typedef int jint;
typedef long long jlong;
或
typedef __int64 jlong;
typedef double jdouble;
typedef float jfloat;
typedef unsigned short jchar;複製代碼
java的boolean在jvm中對應unsigned char類型(0爲false而非0爲true);byte對應signed char類型;short對應short類型;int對應int類型;long對應long long或者_int64類型;double對應double類型;float對應float類型;char對應unsigned short類型。javascript
compiler將java編譯爲class,而class文件除告終構信息和元數據等,還包含了bytecode,這其實就是虛擬機的指令,比如物理機的機器指令。舉個例子,html
public int getInt(){
int a = 100;
return a;
}複製代碼
生成該方法的bytecode爲java
bipush 100
istore_1
iload_1
ireturn複製代碼
bipush 100
將100以byte型推動operand stack中,istore_1
將operand stack頂int型數值存入第二個局部變量,iload_1
將第二個int型局部變量推動operand stack,ireturn
返回int。併發
對於一些toy jvm會簡單地直接用C/C++處理指令,但對於工業級的openjdk中的Hotspot則會繼續生成彙編指令執行。jvm
從上面的狀況能夠看到java的int型編譯成bytecode後可能會變成byte型來表示,這個主要取決於java的int型數值的大小,編譯器會在編譯期間判斷大小從而生成對應的指令,好比小於128時則爲bipush
,大於138且小於32768時則爲sipush
,它表示以short型表示,而大於32768的則都是用ldc+常量池來表示。post
在指令執行時JVM並不須要指明類型,由於指令已經包含了類型信息,但因爲bytecode指令只用1個字節來表示,因此指令數量須要控制,並非每種基礎數據類型都有對應的操做指令,好比iload
lload
fload
dload
對應int
long
float
and
double
。相似還有ireturn
lreturn
freturn
dreturn
。優化
因此執行引擎只要根據不一樣的指令作不一樣的類型處理便可。spa
若是某個java對象調用了native方法,此本地方法由編譯器編譯後access flags 會生成ACC_NATIVE
標識,執行引擎執行bytecode時,根據java-jvm類型的映射也可能會涉及到類型處理。.net
相關閱讀:
從JDK源碼角度看併發鎖的優化
從JDK源碼角度看線程的阻塞和喚醒
從JDK源碼角度看併發競爭的超時
從JDK源碼角度看Java併發的公平性
從JDK源碼角度看java併發線程的中斷線程
====廣告時間,可直接跳過====
鄙人的新書《Tomcat內核設計剖析》已經在京東預售了,有須要的朋友能夠到 item.jd.com/12185360.ht… 進行預約。感謝各位朋友。
=========================
歡迎關注: