这里是一个问题:
如果我通过调用方法(接受说一个参数)来创建单个对象,但我多次调用该方法并每次都传递一个新参数。
void create(String name) {
// Create a dog
Dog dog = new Dog(name);
}
在上面的代码中,如果我多次调用该方法并每次都传递一个唯一的狗名,那么dog变量最后只会指向该方法最后接收到的Dog对象。 / p>
我的问题是以前的狗狗会怎样?它们是否仍在堆内存中,但是没有什么可检索的?
感谢您抽出宝贵时间阅读本文档。非常感谢您的帮助
答案 0 :(得分:2)
无论何时执行new
关键字,JVM都会在堆上分配一个新的内存块来存储实例。
如果我通过调用方法(接受说一个参数)来创建单个对象,但我却多次调用该方法并每次都传递一个新参数。我的问题是以前的狗狗会怎样?它们是否仍在堆内存中,但是没有什么可检索的?
每次调用方法时,都会在当前线程的堆栈内存中分配一个新的堆栈框架,并且对象引用将在该框架的范围内声明,这意味着该对象不符合以下条件:只要您的方法框架有效,垃圾收集(GC)。但是,在您的方法返回/退出后,它将有资格使用GC。
唯一的例外是,如果您将其引用传递到其他地方,则该方法中创建的对象未进行GCed。在这种情况下,对象仍然具有引用它的内容,因此,该对象将由堆维护,并且不会被GC化。
注意,您不控制GC的运行时间,对象可能在方法返回后或一段时间后(通常-很少)被破坏;但是,无论哪种情况,在方法返回后都将丢失对它的引用,这意味着它最终将被GC化。
答案 1 :(得分:0)
我的问题是以前的狗狗会怎样?它们是否仍在堆内存中,但是没有什么可检索的?
它们可能会停留一段时间,直到垃圾回收器启动或JVM退出。
void create(String name) {
// Create a dog
//dog is available in the method
Dog dog = new Dog(name);
return;
//dog is not reachable==> The GC can collect it.
}