Java中用于销毁对象的方法是什么?

7

你能给我一个关于我的问题的例子吗?


7
已经有很多非常相似的问题了,请查看http://stackoverflow.com/questions/2450855/how-do-you-write-a-deconstructor-in-java,https://dev59.com/xXVC5IYBdhLWcg3w1Exq,http://stackoverflow.com/questions/2450855/how-do-you-write-a-deconstructor-in-java等等。在发布之前进行一些搜索。 - Pascal Thivent
1
我认为http://stackoverflow.com/questions/2450855/how-do-you-write-a-deconstructor-in-java也是一个类似的问题。别忘了http://stackoverflow.com/questions/2450855/how-do-you-write-a-deconstructor-in-java,哈哈!;) - Mr. Lance E Sloan
Java不像C#那样,没有IDisposable.dispose()方法。 - devinbost
7个回答

44

抱歉,在Java中没有真正等价于“free”或“dispose”的方法。

你所能做的最好的事情就是将对象设置为null(删除引用)。然后明确告诉垃圾收集器你要进行操作(它在java.lang.Runtime中的某个地方)。


17
Java对象占用的内存如果不再被访问,虚拟机的垃圾回收器会回收它们。正如其他人所指出的那样,这是自动的。相比之下,程序的正常操作可能会分配某些必须显式释放的系统资源。本地屏幕资源就是一个例子。这里是一部分列表中包括以下方法:
java.awt.Component.BltBufferStrategy#dispose() 
java.awt.Component.FlipBufferStrategy#dispose() 
java.awt.CompositeContext#dispose() 
java.awt.Graphics#dispose() 
java.awt.im.InputContext#dispose() 
java.awt.im.spi.InputMethod#dispose() 
java.awt.image.BufferStrategy#dispose() 
java.awt.Image#flush() 
java.awt.PaintContext#dispose() 
java.awt.Window#dispose() 
java.io.InputStream#close()* 
java.io.OutputStream#close()* 
java.sql.Connection#close() 
java.util.Timer#cancel() 
javax.imageio.ImageReader#dispose() 
javax.imageio.ImageWriter#dispose() 
javax.print.StreamPrintService#dispose() 
javax.security.sasl.SaslClient#dispose() 
javax.security.sasl.SaslServer#dispose() 
javax.swing.DebugGraphics#dispose() 
javax.swing.JInternalFrame#dispose() 
org.ietf.jgss.GSSContext#dispose() 
org.ietf.jgss.GSSCredential#dispose() 
* 包括子类

5

其实并没有一种特定的方法。在顶层的Object中定义的finalize()方法可能会在对象被垃圾回收器释放时调用,但这并不是您可以依赖的行为。


2

Java不支持确定性实例终结(即C++的析构函数)。Java有一个垃圾收集器,可以通过代码 Runtime.getRuntime().gc() 调用,但是垃圾收集器运行时最好让内存清理自己完成。


2

2
链接现在已经失效,实际上该网站上的所有链接都已经失效。编辑:已更新为web.archive页面。 - stanek

0
在Java中,“对象销毁”是由JVM自动完成的,当对象符合垃圾回收条件时会被销毁。
例如...
public class gc{
  public static void main(String []s){
     gc obj=new gc();
     gc obj1=new gc();
     // if u made manually obj1=null. its eligible for garbage collection else  jvm done automatically when this obj1 not in use..

       obj1=null;
 }
}

0

Java自动处理所有动态内存分配和释放。基本上,任何不再被命名变量引用的内存都将成为垃圾收集的候选对象(没有匿名变量)。当所有引用该内存的变量被设置为其他值或超出其作用域时,就会发生这种情况。

垃圾收集将自动进行,但没有特定的时间来实际释放任何一块内存。

大多数人不需要知道更多,但之前由corprew发布的链接以直观的格式提供了很多详细信息,适合任何有兴趣学习更多的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接