Java 堆和栈被误解

Java heap and stack missunderstood

我又看了一遍我的问题,我认为这个例子不够好,无法说明我的困惑在哪里。所以我将展示一个不同的例子。

public class Main {
    public static void main(String args[]) {
        Foo foo = new Foo();
        foo.deleteOtherFoo();
    }
}

public class Foo {

    private OtherFoo otherFoo;

    public Foo() {
        otherFoo = new OtherFoo();
    }

    public void deleteOtherFoo() {
       this.otherFoo = null;
    }
}

public class OtherFoo {
   public OtherFoo() {}
}


如果按照我对堆栈和堆的了解,我可以说:

my draw

在 deleteOtherFoo 框架中,我有什么参数?因为我知道我只能有原始类型或引用类型值。在那种情况下,我有一个引用类型 Foo.otherFoo ?包含指针的指针的值 ?

因为当我输入 this.otherFoo = null 时,我从对象 foo 中删除了 otherFoo 的引用。

代码存在于一个完全不同的地方。代码实际上是不变的,除了一些疯狂的 'reload this class from disk again please' 恶作剧(JVM 确实支持,但那是完全不同的蠕虫病毒)。

那么 'the method' 住在哪里?好吧,无处可去。该方法的代码存在于过去称为 permgen 的地方。它绝对不是堆栈,永远不会被垃圾收集,无论你创建多少个 Foo 对象,代码只会在内存中定位一次。

就是这样..直到你调用这个方法。

调用方法时,如果是非静态的,需要'an instance'。就 JVM 而言,这与参数几乎 100% 相同:如果调用 foo.doThingie(a);,则 foo 和 a 都是 doThingie 方法的参数。这些被放入堆栈,然后执行 doThingie。一旦 doThingie 完成执行,堆栈将重置为调用 doThingie 之前的点,因此,'foo' 和 'a' 现在消失了。

在java中,所有非原始类型都是'references',这只是java代表'pointers'。所以当我说 'foo and a are on the stack' 时,我真正的意思是 'a pointer, into the heap, pointing at the data (i.e., the fields) that represent an instance of Foo, is on the stack'.