Java变量放在堆栈或堆上

我对Java没什么了解。

我经历了几个链接,发现博客上写着“存储在堆栈上的Java Primitives”,我觉得它依赖于实例变量或局部变量。

经过几个链接我的结论是,


类变量 – 基元 – 作为它包含的Object的一部分存储在堆上。

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

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

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

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

如果我的理解是错误的,请纠正我。 谢谢。

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

类存储在堆的特殊部分,但这取决于您使用的JVM。 (Hotspot中的Permgen fe <= 24)。

一般而言,您不必考虑数据的存储位置,而是更多地考虑可见性和生存时间等语义。 到目前为止,您对问题的解释看起来不错。

“方法变量 – 对象(用户定义) – 存储在堆上,但……”

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

我们考虑一下

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

变量model放在堆栈框架中,而不是放在堆上。 使用new ArrayList()生成的引用对象放在堆中,但它不是局部变量

三件事:

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

是完全不同的,不要搞砸他们。

对象存储在堆中。

对象引用存储在堆栈中。

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

示例abc obj = new abc();

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

static int i = 10;

i变量存储在方法区域中。