Java变量放置在堆栈或堆上

我对Java没有太多的想法。

我正在经历几个链接,发现博客说“存储在堆栈中的Java基元”,我觉得它取决于实例变量或局部变量。

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


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

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

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

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

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

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


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

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

一般来说,您不应该考虑数据的存储位置,而应该考虑更多关于可见性等语义以及事物生存时间的信息。 目前为止,您在问题中的解释看起来不错。


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

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

我们来考虑一下

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

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

这3件事情:

  • 可变model
  • 生成的对象
  • 引用该对象,存储在一个变量中
  • 是完全不同的,不要把它们搞乱。


    对象存储在堆中。

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

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

    示例abc obj = new abc();

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

    static int i = 10;

    变量存储在方法区域中。

    链接地址: http://www.djcxy.com/p/79087.html

    上一篇: Java variable placed on stack or heap

    下一篇: Method local variables and stack and heap