对象的私有成员是在堆上还是在栈上?

Posted

技术标签:

【中文标题】对象的私有成员是在堆上还是在栈上?【英文标题】:Are object's privitive members on the heap or on the stack? 【发布时间】:2012-07-28 23:26:12 【问题描述】:

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

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

因此:

class B

 ...


class A

   int a;
   B b;

A.a 是在堆栈中还是在堆中?

【问题讨论】:

***.com/questions/3646632/… 看到这个答案 【参考方案1】: 类对象,包括方法代码和静态字段:堆。 对象,包括实例字段:堆。 局部变量和方法调用:堆栈

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于对象的私有成员是在堆上还是在栈上?的主要内容,如果未能解决你的问题,请参考以下文章

C++:在堆上创建对象,还是在栈上?

Go 语言中的变量究竟是分配在栈上还是分配在堆上?

Go 语言中的变量究竟是分配在栈上还是分配在堆上?

JAVA中的类成员变量是存在堆还是栈里面呀?

C++中如何设计一个类只能在堆或者栈上创建对象

特殊作用的私有成员函数