参考:https://blog.csdn.net/antony1776/article/details/89843145
在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 规范中并没有详细规定引用类型的实现细节,比如引用应该通过何种方式去定位、访问堆中的对象,具体的对象访问方式取决于虚拟机的具体实现。
目前主流引用类型的实现方案两种:句柄,直接指针。
![](https://img.haomeiwen.com/i16830368/121ca74165ae014b.png)
![](https://img.haomeiwen.com/i16830368/0920ef9aab2ea536.png)
两种方式各有优劣:
句柄:访问的最大好处就是 reference 中存储的是稳定的句柄地址,在对象被移动(比如垃圾回收时,整理内存空间,会移动对象的存储位置)时只会改变句柄中示例数据的指针,而 reference 本身不需要修改。
直接指针:访问的最大好处就是速度更快,节省了一次内存寻址的时间开销。
网友评论