【问题标题】:Deleting a class object in java在java中删除一个类对象
【发布时间】:2014-09-01 18:44:46
【问题描述】:

我有一个名为Point 的类,如下所示:

public class Point {
    public int x;
    public int y;

    public Point(int X, int Y){
        x = X;
        y = Y;
    }

    public double Distance(Point p){
        return sqrt(((this.x - p.x) * (this.x - p.x)) + ((this.y - p.y) * (this.y - p.y)));
    }

    protected void finalize()
    {
        System.out.println( "One point has been destroyed.");
    } 
}

我有一个来自此类的对象,名为 p,如下所示:

Point p = new Point(50,50);

我想删除这个对象,我搜索了怎么做,我找到的唯一解决方案是:

p = null;

但是Point的finalize方法在我做完之后就不起作用了。我能做什么?

【问题讨论】:

  • 如果没有对对象的引用,垃圾收集器会在它认为必要的时候处理它。
  • 您说要删除该对象。这在 Java 中并不常见。通常,垃圾收集器负责释放内存,close 方法负责释放其他资源。你想破坏对象达到什么效果?要么让它被 GC 处理,要么编写并使用 close 方法可能是要走的路。

标签: java class object-destruction


【解决方案1】:

在java中没有“删除对象”这样的东西。当垃圾收集器发现没有对它的引用时,它会自动删除对象。在对象从内存中永久删除之前,垃圾收集器也会自动调用finalize() 方法。您无法控制何时发生这种情况。

【讨论】:

    【解决方案2】:

    您不需要销毁对象,垃圾收集器会为您完成。

    【讨论】:

      【解决方案3】:

      你不能在 java 中删除对象,这是 GC (Garbage Collector) 的工作,它找到并删除未引用的实例变量。这意味着不再指向或引用的变量,这意味着它们现在无法被调用。因此,当您这样做 p = null; 时,您将 null 分配给持有对 Point 对象的引用的引用变量。因此,p 指向的 Point 对象现在是可回收的。

      同样按照javadocfinalize()的方法,

      Called by the garbage collector on an object when garbage collection 
      determines that there are no more references to the object. 
      A subclass overrides the finalize method
      to dispose of system resources or to perform other cleanup.
      

      但不能保证调用finalize() 方法,因为不能保证GC 在特定时间(确定性时间)运行。

      【讨论】:

        【解决方案4】:

        当没有指向该对象的剩余指针时,可以销毁该对象。

        垃圾收集器会随机删除它。 您可以拨打System.gc(),但不建议这样做。系统应该是能够管理内存的系统。

        【讨论】:

          【解决方案5】:

          在您执行p = null; 之后,您点的最后一个引用被删除,垃圾收集器现在收集该实例,因为没有对该实例的引用。如果您调用System.gc();,垃圾收集器将回收未使用的对象并调用该对象的 finalize 方法。

              Point p = new Point(50,50);
              p = null;
              System.gc();
          

          输出:One point has been destroyed.

          【讨论】:

            【解决方案6】:

            实际上 p = null 只会使对象在java堆中丢失引用。但是,对象 P 仍然处于活动状态。如果您使用 System.gc() 您将能够清除所有活动对象,包括它在 java 堆中的引用。所以,我建议在执行 p = null 之后使用 System.gc()

            【讨论】:

              【解决方案7】:

              当不再引用的对象成为可声明的候选对象时,GC 回收对象。 对于基本应用程序,无法确定 GC 是否在进程生命周期内运行。因此,这里有一个测试理论的小例子:

              public class Test {
                  static class Sample {
                      @Override
                      protected void finalize() throws Throwable {
                          System.out.print(this + " The END");    
                      } 
                  }
                  public static void main(String...args) throws Exception {
                      // Extra care 
                      Runtime.getRuntime().runFinalization();
                      Sample sample = new Sample(); sample = null; // Object no longer referenced
                      System.gc(); // Ensures FULL GC before application exits
                      Thread.sleep(1000); // Relax and see finalization out log
                  }
              }
              

              【讨论】:

                【解决方案8】:

                如果没有方法调用点并且不是因为内存管理问题,则将其留给垃圾收集器或显式调用它。否则请提及为什么要删除它,以便建议其他方式。

                【讨论】:

                  猜你喜欢
                  • 2016-07-28
                  • 2021-07-11
                  • 1970-01-01
                  • 2013-06-03
                  • 2016-11-14
                  • 2015-09-12
                  • 1970-01-01
                  • 2017-03-23
                  相关资源
                  最近更新 更多