1

以任何带有引用的 OOP 语言为基本结构,如 java 和 c#。

为了快速执行,它们还支持 int 和 char 等原始类型。我认为这是通过将它们存储在堆栈上来完成的。和堆上的对象类型。

所以为此:

class B
{
 ...
}

class A
{
   int a;
   B b;
}

Aa 是在堆栈中还是在堆中?

4

3 回答 3

1
  • 类对象,包括方法代码和静态字段:堆。
  • 对象,包括实例字段:堆。
  • 局部变量和方法调用:堆栈

但是对于 java6,有些情况是在堆栈上创建对象。

证明:http ://docs.oracle.com/javase/specs/jvms/se5.0/html/Concepts.doc.html#29375

于 2012-07-31T08:27:57.193 回答
1

基本答案是所有局部变量都在堆栈上,而其他所有变量都在堆上。但是,从 Java 7 开始,编译器将执行一种称为Escape 分析的技术,该技术检查对象是否在方法中严格使用(并且不会转义该方法),并在找到这样的对象时,将其存储分配到堆。Java 6 Update 14引入了此行为,但默认情况下未激活。

这与许多其他示例一样,向您展示了 Java 语言规范是一回事,而实现则是另一回事。只要实现的行为符合 JLS 的定义,它就是合法的。

于 2012-07-31T09:44:09.097 回答
0

只有局部变量存储在堆栈中,其他变量存储在堆中。

于 2012-07-31T08:29:24.007 回答