jvm规范规定引用只占用一个局部变量槽(jvms12.6.1)。此外,它还指出 double 以及 long ,占用两个局部变量插槽,因为它们是64位的。这是否意味着所有符合jvm的实现都必须使用32位寻址?64位JVM如何处理这个问题?它们是使用64位局部变量插槽,还是使用2个插槽作为引用?
double
long
gev0vcfq1#
这是否意味着所有符合jvm的实现都必须使用32位寻址?64位JVM如何处理这个问题?它们是使用64位局部变量插槽,还是使用2个插槽作为引用?不。时隙是一种抽象,其目的是允许指定字节码的行为。jvm解释器和jit编译器做了一些聪明的事情,将插槽Map到虚拟内存地址。这些Map考虑了引用可能是32位或64位地址(或32位压缩oop)这一事实一个(抽象)插槽用于引用,与指针的实际大小无关。问:他们为什么这样定义槽?答:所以相同的字节码在32位和64位java平台上具有相同的含义!问:如果你试着把一个槽中的内容看作一种不同的类型,为什么它不会崩溃?答:因为jvm的字节码分析器不允许您这样做!
1条答案
按热度按时间gev0vcfq1#
这是否意味着所有符合jvm的实现都必须使用32位寻址?64位JVM如何处理这个问题?它们是使用64位局部变量插槽,还是使用2个插槽作为引用?
不。
时隙是一种抽象,其目的是允许指定字节码的行为。jvm解释器和jit编译器做了一些聪明的事情,将插槽Map到虚拟内存地址。这些Map考虑了引用可能是32位或64位地址(或32位压缩oop)这一事实
一个(抽象)插槽用于引用,与指针的实际大小无关。
问:他们为什么这样定义槽?
答:所以相同的字节码在32位和64位java平台上具有相同的含义!
问:如果你试着把一个槽中的内容看作一种不同的类型,为什么它不会崩溃?
答:因为jvm的字节码分析器不允许您这样做!