你能举一个我的问题的例子吗?
答案 0 :(得分:41)
很抱歉,但Java中没有真正的“免费”或“免除”等价物。
您可以做的最好的事情就是将对象设置为null(删除引用)。然后明确地告诉垃圾收集器你要去rambo(它在java.lang.Runtime
的某处)。
答案 1 :(得分:17)
虚拟机garbage collector可以回收不再可访问的Java对象占用的内存。正如其他人所说,这是自动的。相反,程序的正常操作可以分配必须明确释放的某些系统资源。原生屏幕资源就是一个例子。这些方法的部分list包含以下内容:
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() * Includes subclasses
答案 2 :(得分:3)
本身没有方法。当垃圾回收器释放对象时,可以调用顶层finalize()
中定义的Object
方法, ,但这不是您可以依赖的行为
答案 3 :(得分:3)
Java不支持确定性实例终结(即C ++的析构函数)。 Java有一个可以被你调用的垃圾收集器(比如这个Runtime.getRuntime().gc()
),但是当你单独留下内存清理时,垃圾收集的运行时往往效果最好。
答案 4 :(得分:3)
这解释了垃圾收集(为什么你不必在Java中显式删除对象)的工作原理:http://web.archive.org/web/20080205091525/http://chaoticjava.com/posts/how-does-garbage-collection-work/
检查出来,询问后续问题是否有帮助。
答案 5 :(得分:0)
Java自动处理其所有动态内存分配和释放。基本上任何不再被命名变量引用的内存都有资格进行垃圾收集(没有匿名变量)。当引用该内存的所有变量都设置为其他内容或超出范围时,就会出现这种情况。
垃圾收集会自动发生,但实际上没有特定的时间来释放任何内存。
大多数人不需要了解更多,但corprew之前发布的链接以直观的格式为有兴趣了解更多信息的人提供了大量细节。
答案 6 :(得分: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;
}
}