【问题标题】:How does Java associate a variable name with a location in memory?Java 如何将变量名与内存中的位置相关联?
【发布时间】:2013-05-13 17:50:42
【问题描述】:

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

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

【问题讨论】:

  • 除非您自己实现 JVM,否则您不需要分配或跟踪变量的确切内存位置。
  • 变量名必须以某种方式进行限定,因为您不仅可以在不同的类中拥有同名的变量,而且可以在同一个类或方法中但在不同的范围内。跨度>
  • 它可能没有;我的猜测(基于查看一些字节码)是变量名仅与编译器相关。
  • 当你的程序被编译时,基本上所有的变量名(当然在方法实现中)都被删除了;你的程序是用字节码重写的,它只通过它们在堆栈上的位置来引用变量。

标签: java memory-management


【解决方案1】:

原始类型变量的值是一些数字,引用类型变量的值是一个引用(通常是内存地址)。

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

本地人的名字在编译过程中被解析。每个变量都成为方法中的第 i 个变量,并将作为第 i 个变量存储在某个方法调用的堆栈帧中。

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

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

【讨论】:

  • 您似乎专注于实际对象的存储位置。但是变量和对象之间的连接是如何发生的呢?必须在内存中的某个地方,变量保存有关其对象或原语所在位置的数据。
  • 字段和局部变量名称在编译期间被解析为表偏移量。在运行时,变量由它们包含的堆栈帧/实例/类(用于静态)拥有,但没有返回它的链接——它们不需要。在它的 stackframe/instance/etc 容器之外没有访问变量之类的东西。
【解决方案2】:

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

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

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

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

【讨论】:

  • 问题是关于 Java 和内存管理,即运行时,这里没有什么可以真正回答它。相反,所有这些大约 90% 是不相关的,包括奇怪的断言,即“编译的核心问题是跟踪所有关于对象的知识”。那是容易的部分。解析和代码生成是核心问题。
  • 这个问题没有提到内存管理。这表明对计算机科学的了解很少,所以我抛出了一堆关键字,希望您可以环顾四周并学到一些东西。
  • 这个问题没有提到内存管理。我抛出了一堆关键字,希望你可以环顾四周并学到一些东西。在所有类型的程序中使用三种通用类型的数据存储器:静态存储器为每个变量使用单个存储单元。大小由变量类型决定。高级语言还在语句的文本块中提供局部变量。高级技术采用动态内存分配——信息存储在称为“堆”的内存“池”中。存储的名称分配取决于正在使用其中的哪一个。
  • 您无法生成代码来操作您无法定义的内容。解析是在 1970 年代用 LALR(1) 等解决的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多