Java如何将变量名与内存中的位置相关联?

时间:2013-05-13 17:50:43

标签: java memory-management

Java如何将变量名与内存中的位置相关联?

我首先想到的是必须有一个静态表,用于所有变量名称,将其与值或其值的位置相关联。它是否存在并且该表是否有正式名称?

2 个答案:

答案 0 :(得分:4)

基本类型变量的值是某个数字,引用类型变量的值是引用(通常是内存地址)。

现在的问题是:给定变量的存储值在哪里。它取决于变量的类型 - 有局部变量,实例变量(字段)和类变量(静态字段)。

编译期间解析了本地人的名字。每个变量在方法中变成简单的第i个变量,它将被存储为某个方法调用的堆栈帧中的第i个变量。

例如变量会有所不同。字段名始终存在于字节码中(但通常不会出现在JIT编译器生成的机器代码中)。给定类的所有对象具有相同的布局,因此类可以存储给定字段的 offset - 距对象的开头的距离。解释器可以读取对象的地址并添加偏移量来计算变量存储的位置。

类变量与实例变量类似,但更简单。在这种情况下,类存储其变量的名称和值。

答案 1 :(得分:0)

历史编译包括创建符号表,该符号表将变量名称与从源代码确定的属性相关联。出于说明的目的,这有点过于简单,但由于FORTRAN很有用,因此原则没有改变。 C ++和Java等语言中的用户定义类型构成了编译期间收集的每个编译单元的元数据的一部分,并在创建运行时可执行文件或将其加载到内存时编织在一起。

请注意,必须先定义所有类型,然后才能使用它们来定义类型的对象。这是Java中'import'和C / C ++中'#include'的目的。元数据包括方法和对象(或类)数据元素的定义,用于确定在静态内存,堆栈(块入口/出口)或堆(动态分配)上创建的对象的大小。 p>

在编译时或执行期间进行类型检查是过去四十年来最重要的发展之一,也是我们能够在火星,加州高速公路或互联网上使用自主机器人的主要原因。在它的核心,编程语言编译或转换的核心问题是跟踪所有关于对象的知识并将其放在内存中,以便在运行时正确使用它。

像FORTRAN和COBOL这样的古代语言有一种类型的变量(静态),它只有基本的数据类型属性。他们有几乎琐碎的符号表。最复杂的问题是将编译单元链接在一起以便执行。宝贝,我们走了很长的路!