为什么JVM局部变量表的一个slot至少要能容纳一个int类型的变量

实际上操作数栈的最小单位也是能容纳一个int变量。那么使用boolean,byte,char和short这些类型的时候就只能浪费一些空间了,为什么要做这样的设计呢?!

原因很简单,大部分JVM字节码指令都没有支持boolean,byte,char和short类型,在处理这些类型的数据时,都是使用int类型的相关指令。举例说,load/store指令都只有iload,istore,把一个byte类型的局部变量load到操作数栈顶时,需要使用iload指令,如果操作数栈和局部变量表使用1byte空间存储该变量就会出错了。

Java语言被创造出来的时候显然受到了SUN公司自己的SPARC精简指令集的设计影响,同时也为了满足在网络上传输代码的需求,Java虚拟机的字节码指令被限定为一个字节,因此操作码总数不能超过256个,这迫使字节码指令只能选择支持一部分数据类型。这个设计上的选择带来了一些side effect,其中就包括局部变量表和操作数栈的slot大小。由于字节码中已经不包含原来的byte,short一类的类型信息了,JIT编译之后执行的机器码也不可能在存储空间上有任何优化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章