29

我对Java没有太多想法。

我浏览了几个链接,发现博客说“Java Primitives stored on stack”,我觉得这取决于实例变量或局部变量。

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


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

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

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

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

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

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

4

3 回答 3

15

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

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

一般来说,您不必考虑数据的存储位置,而应该更多地考虑语义,例如可见性和某些东西的寿命。到目前为止,您在问题中的解释看起来不错。

于 2013-10-16T11:33:06.210 回答
5

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

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

让我们考虑一下

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

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

3件事:

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

完全不同,不要把它们搞砸。

于 2013-10-16T12:31:10.803 回答
1

对象存储在堆中。

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

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

例子

abc obj=new abc();

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

  static int i=10;

i 变量存储在方法区。

于 2013-10-16T11:57:31.570 回答