在jvm中,数据分为原始类型和引用类型(Reference) 。
原始类型
Java虚拟机支持的原始数据类型是数字类型,boolean类型和returnAddress 类型。
-
数字类型:由
整数类型和浮点类型组成。-
整数类型为:
byte,其值为8位带符号的二进制补码整数,并且其默认值为零short,其值为16位带符号的二进制补码整数,并且其默认值为零int,其值为32位带符号的二进制补码整数,并且其默认值为零long,其值为64位带符号的二进制补码整数,并且其默认值为零char,其值为16位无符号整数,表示基本多语言平面中的Unicode代码点,并以UTF-16编码,其默认值为空代码点('\u0000')。
-
浮点类型为:
float,其值是float值集的元素,或者(在受支持的情况下)float-extended-exponent值集的元素,其默认值为正零double,其值是双精度值集或受支持的双扩展指数值集的元素,并且其默认值为正零
-
-
boolean:该
boolean类型的值真实值true,默认值为false。 -
returnAddress:该
returnAddress类型的值是指向Java虚拟机指令的操作码的指针,returnAddress 数据只存在于字节码层面。与数字原始类型不同,该returnAddress类型不对应于任何Java编程语言类型,并且不能由正在运行的程序进行修改。对于 JVM 来说,程序就是存储在方法区的字节码指令,而 returnAddress 类型的值就是指向特定指令内存地址的指针。
引用类型
让 JVM 能更好的支持于面向对象语言的设计,引用类型的值用来指向内存中分配的类实例(对象)或者数组。JVM 规范中并没有详细规定引用类型的实现细节,比如引用应该通过何种方式去定位、访问堆中的对象,具体的对象访问方式取决于虚拟机的具体实现。
目前主流引用类型的实现方案两种:句柄,直接指针。
两种方式各有优劣:
句柄:访问的最大好处就是 reference 中存储的是稳定的句柄地址,在对象被移动(比如垃圾回收时,整理内存空间,会移动对象的存储位置)时只会改变句柄中示例数据的指针,而 reference 本身不需要修改。
直接指针:访问的最大好处就是速度更快,节省了一次内存寻址的时间开销。