关于垃圾收集:在java中,我们如何从类中的方法中破坏类的实例

In java, how can we destruct an instance of a class from a method within the class

我对它的处理类似于删除任何常见对象的情况,即,只需将引用设为空并让垃圾收集器完成它的工作。

但是,对于类内等于空的情况,对对象的唯一引用是"this"。以下类的代码是否有效:

1
2
3
4
5
6
7
8
9
10
11
class A{
  public A(){
    //Init
  }

  public void method destruct(){
    if(someCondition){
      this=null;  //Is this statement valid? Why / Why not?
    }
  }
}


你不会在Java中"破坏"对象。这是个错误的想法。不要这样做。

对象是在Java堆中创建的。只要有一个参照物指向他们,他们就活得很长。垃圾收集者把这些乱七八糟的东西清理干净。

你当然应该尽你所能确保你不会不必要地积累和保留引用(例如,在Swing中的听众)。

但你的建议根本不正确。停下来。


1
this=null;  //Is this statement valid? Why / Why not?

它不是有效的Java,因为EDCOX1〔6〕不是LValk;也不是指您可以指派的东西。这是一个编译错误,就像42 = i;是一个编译错误一样。

(jls对赋值做了如下描述:"赋值运算符的第一个操作数的结果必须是一个变量,否则会出现编译时错误。"-jls 15.26.1 jls文本随后列出符合变量的不同内容,而this不是其中之一。)

此外,正如达夫莫莫所言,在爪哇做这件事是完全错误的。让GC来做它的工作。


注意:你的建议不太可能有用。

你能做的就是使用委托。

1
2
3
4
5
6
7
8
9
class A {
   private AImpl impl = new AImpl();

   public void close() {
      if (impl != null)
         impl.close();
      impl = null;
   }
}

由于所有引用都是间接的,因此可以确保只有一个对实际对象的引用,并将其清除。

一些OSGi容器中的代理在卸载组件时执行此操作。由于容器对引用的生命周期几乎没有控制权,因此很难卸载库(实现)。


设置this = null就像试图说一个对象没有引用它自己。它总是隐式地引用自身。您需要找到其他哪些对象可能正在引用这个对象,并清除它们的引用。通常,这是自动发生的,因为大多数对象是通过堆栈上的局部变量保留的。当我说"保留"时,我的意思是它们是通过一个引用链引用的,这个引用链最终会导致堆栈上的一个变量。当您离开方法时,引用被清除。但是,如果有一个引用此对象的静态变量,那么在这种情况下,必须显式地将其设置为空。


你的目标被深深地误导了。

实例外部的任何一个人都持有对它的非弱引用。不管你在里面做什么,它都不会被收集。或者没有人这样做,那么不管你在里面做什么,它最终都会被收集起来。在这两种情况下,EDCOX1×1都没有区别,即使是合法的Java代码。不要这样做。如果你关心的是对象的生存期和内存耗尽,那就把你想要摆脱的对象从一边看出来。


执行线程位于析构函数()方法内的原因告诉我,有一个调用方正在对类A的实例进行引用,但是,在Java中,您不能做任何类似"这=null"的事情,即使Java中允许使用它也不会有帮助。不能破坏Java中的对象。


这是一个编译错误。不能将空值赋给"this"。关键字"this"可用于等号的右侧(但左侧不为空除外)。原因:不能将任何内容分配给空值)。

为了破坏,在Java中,你有一个GC可以在幕后为你做这项工作。

请注意,对于用户定义的对象,您仍然可以执行以下操作-

1
object reference = null;

但是"this"不能用于equals的左侧。


不,上面的代码无效。类的引用this仅在执行JVM时持续。设置this == null实际上会给你一个编译器错误,因为虽然this被称为引用,但它实际上是一个值,你不能给一个值赋值。

另外,由于this仅在代码中执行且gc不能声明仍在执行的对象时才有效,因此这是不必要的。但是,一旦对象的执行结束,this也将丢失,对象将自动对gc可用(即,如果不存在对对象的其他引用)。


你可以打电话:

1
 System.gc() or RuntimeUtil.gc() from the jlibs

但是如果你这样做了,你会弄乱JVM运行时。如果将reference设置为空,则该对象仍然存在,它的"just its"引用将不会引用该对象,并且在下次调用gc时,它将销毁该对象(除非其他引用引用引用它)。


对象的生命周期由JVM控制,因此对象不能决定何时不再需要它自己。您可以做的是对这个对象的引用进行一些努力。可以使用引用类型来指出对象的"重要性"。

Java中引用的基本类型可以在这里找到:

更多信息请访问:http://docs.oracle.com/javase/1.3/docs/api/java/lang/ref/package-summary.html

此处讨论参考文献:Java中的软引用和弱引用有什么区别?和理解Java的引用类:软引用、弱引用和幻像引用


在方法中,this是对调用当前方法的对象的引用,因此不应该更改它。把这当作最后的参考。


不。当没有引用指向某个实例对象时,GC可以删除该实例对象,即它在所有正在运行的线程中都无法导航到该对象。当您在执行一个方法的对象中时,这个方法是从外部调用的,因此有一个对该对象的引用。对象本身不能被销毁,因为对它的引用仍然保留在外部。

考虑另一种内存管理方法。


在Java中,没有明确的EDCOX1(2)特定引用的方法。Java这样做是为了避免挂起引用。如果您delete一个对象,那么引用它的其他对象可能会尝试访问数据并获取对无效数据的引用。

无论如何,您不应该尝试delete对象,只需将对该对象的所有引用移动到空。


对于Java垃圾收集器来说,它不应该被引用为其他类。

语句this=null;是非法的,因为赋值的左侧必须是变量。