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'.
我又看了一遍我的问题,我认为这个例子不够好,无法说明我的困惑在哪里。所以我将展示一个不同的例子。
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'.