1

举个例子。

public class test {
  public static void main(String args[]) {
    int a=5,b=4;
    int c=a+b;
    int d=9;
    System.out.println("ANSWER PLEASE..");
  }
}

现在,当我们执行这段代码时,os 做了什么?

它首先创建一个名为的变量,并为和a分配一个类似的内存地址。bc

现在发生了什么事d。os 创建一个新的内存地址,或者它只是引用地址,c因为值是相同的。

4

2 回答 2

3

首先,编译器没有做太多事情。它基本上将其转换为类文件/字节码。在字节码中有一个称为“max locals”的数字,它告诉运行该方法需要多少局部变量。

另一方面,读取这些信息并运行代码的JVM确保在堆栈帧上分配内存以适应所需的变量。它要求多少高度依赖于实现,它可以很好地优化整个事情,并分配比代码指示的更少的字节。

于 2012-08-01T06:47:49.510 回答
0

发生了什么 d. os 创建一个新的内存地址,或者它只是引用 c 的地址,因为值相同。

  • 这被标记为 Java。所以让我们把操作系统排除在外。一切都发生在由 JVM 管理的内存中,该内存是预先以大块分配的。
  • 您正在谈论原始数据类型。这些很容易,因为它们是按价值存储的,而不是作为对生活在其他地方的对象的引用。
  • 你在谈论局部变量。这些分配在正在运行的线程的调用堆栈上(而不是在堆内存中)。由于它们在这里也是原始的,因此根本不涉及堆。
  • 在您的情况下,为四个整数分配了内存(在堆栈上)。它们中的每一个都包含分配给它的值,而不是引用。即使将相同的值分配给所有它们,它们也单独存在。当方法返回时,内存被“释放”(没有真正释放,但不再被线程使用)。
  • 如果那些不是整数,而是对象,您可以“共享指针”(指向堆上的对象),但整数是按值存储的(每个四个字节)。
于 2012-08-01T07:14:32.413 回答