放在堆栈或堆上的Java变量是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (3)
  • 关注 (0)
  • 查看 (131)

我发现博客说“存储在堆栈上的Java基元”,我觉得它取决于实例变量或局部变量。

经过几个环节,我的结论是,

类变量 - 原语 - 作为它包含的Object的一部分存储在堆上。

类变量 - 对象(用户定义) - 作为它包含的对象的一部分存储在堆上。 对于参考和实际对象都是如此。

方法变量 - 基元 - 作为该堆栈帧的一部分存储在堆栈中。

方法变量 - 对象(用户定义) - 存储在堆上,但堆上该区域的引用作为该堆栈帧的一部分存储在堆栈中。 如果Object包含另一个对象,也可以将引用存储在堆上。

静态方法(实际上所有的方法)以及静态变量都存储在堆中。

提问于
用户回答回答于

在JVM中有一些优化甚至可以使用Stack for Objects,这减少了垃圾收集工作。

类存储在堆的特殊部分,但取决于使用的JVM。 (热点中的Permgen f.e. <= 24)。

一般来说,不应该考虑数据的存储位置,而应该考虑更多的关于可见性和事物生存时间的语义。 你在问题中的解释看起来不错。

用户回答回答于

错了。首先,方法变量称为局部变量。

让我们考虑一下

public static void main(String[] args) {
    List<Integer> model = new ArrayList<Integer>();

变量模型放置在堆栈框架中,而不是放在堆上。 用new ArrayList <Integer>()生成的引用对象放置在堆中,但它不是局部变量。

三件事:

  • 变量model
  • 生成对象
  • 对该对象的引用,存储在变量中。

完全不同,别把他们搞混了。

用户回答回答于

对象存储在堆中。

存储在堆栈中的对象引用。

存储在方法区域中的静态变量。

示例abc obj = new abc();

abc对象保存在堆中,对象引用存储在堆栈中。

static int i = 10;

我变量存储在方法区域。

扫码关注云+社区

领取腾讯云代金券