【问题标题】:What happens to objects created in a method which is called repeatedly?在重复调用的方法中创建的对象会发生什么?
【发布时间】:2023-03-20 12:29:01
【问题描述】:

问题来了:

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

void create(String name) {

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

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

我的问题是之前的狗对象会发生什么?它们是否仍在堆内存中但​​没有任何东西可以检索它?

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

【问题讨论】:

    标签: java object methods


    【解决方案1】:

    每当您执行new 关键字时,JVM 都会在堆上分配一个新的内存块来存储实例。

    如果我通过调用一个方法(接受一个参数)创建单个对象,但我多次调用该方法,每次都传递一个新参数。我的问题是以前的狗对象会发生什么?它们是否仍在堆内存中但​​没有任何东西可以检索它?

    每次调用方法时,都会在当前线程的堆栈内存上分配一个新的堆栈帧,并且您的对象引用将在该帧的范围内声明,这意味着它将不符合条件垃圾回收 (GC)只要您的方法框架还活着。但是,在您的方法返回/退出后,它将有资格获得 GC。

    唯一的例外是,在方法中创建的对象未经过 GC,如果您将其引用传递到其他地方。在这种情况下,object仍然有引用它的东西,因此它将由堆维护,并且不会被GC。

    注意,你无法控制 GC 何时运行,对象可能会在方法返回后立即销毁,或者在一些 [通常 - little] while 之后被销毁;但是,无论哪种情况,在方法返回后您都会丢失对它的引用,这意味着它最终会被 GCed。

    【讨论】:

    • 这个答案确实提供了有关 GC 的正确高级信息。有时应用程序分配内存的速率可能高于 GC 能够清除它的速率,但在这种情况下不适用。答案可能会涉及到这一点。
    • @OmarAbdelBari 你能详细说明你想到的场景吗?
    • 在游戏开发等场景中,实例化一个通用对象可能会非常昂贵。我不知道这是否是 Java 开发人员经常使用的地方(我自己正在使用其他东西)。这更像是一个需要牢记的通用托管内存点。
    • 对于中间(或机器)级别的代码,你开发游戏、ERP系统或控制台应用程序都没有关系。对于高级 ptogramming 语言也无关紧要。我最初以为您指的是 GC 过程。正如我在上面所写的那样,在非常高的层次上,Java 管理内存。如果分配的对象是 X 字节,则完全处置它将释放 X 字节。 GC 有不同的层,但这在这里并不重要。
    【解决方案2】:

    我的问题是之前的狗对象会发生什么?它们是否仍在堆内存中但​​没有任何东西可以检索它?

    它们可能会停留一段时间,直到垃圾收集器启动或 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.
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多