通过反复调用的方法创建的对象会发生什么情况?

时间:2020-09-20 16:49:33

标签: java object methods

这里是一个问题:

如果我通过调用方法(接受说一个参数)来创建单个对象,但我多次调用该方法并每次都传递一个新参数。

void create(String name) {

        // Create a dog
        Dog dog = new Dog(name);
}

在上面的代码中,如果我多次调用该方法并每次都传递一个唯一的狗名,那么dog变量最后只会指向该方法最后接收到的Dog对象。 / p>

我的问题是以前的狗狗会怎样?它们是否仍在堆内存中,但是没有什么可检索的?

感谢您抽出宝贵时间阅读本文档。非常感谢您的帮助

2 个答案:

答案 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.
}