2016-02-12 76 views
1

我对Java的垃圾收集器的了解是,它处理所有需要的东西,但我关心的是效率。在Java中释放对象

一些其他语言,如Python - 据我所知 - ,可以通过实际这样做有助于垃圾回收器:

objectReference = none 

这是否工作在Java中,程序员可以几乎免费的方式通过将变量分配给null以有效的方式堆存储器?如果是的话,与C的free()函数手动释放内存相比,这个效率如何?

+4

请参阅[在Java影响垃圾回收中是否将对象指定为null](http://stackoverflow.com/questions/449409/does-assigning-objects-to-null-in-java-impact-garbage-collection) 。另外,我们需要记住algos不断从JDK更改为JDK。 –

+0

你的答案也可能在这篇文章中:http://stackoverflow.com/questions/1481178/how-to-force-garbage-collection-in-java – vefthym

+1

我不确定你应该标记这个问题_python_甚至尽管你确实提到过它。您将吸引无法回答问题的Python程序员。对于这个问题,Python真的不重要。当您询问语言的比较时,_c_标签可能正常。 – Matthew

回答

2

变量在超出范围后不再存在,例如,当方法返回时,所以早期很少有从变量中获得任何好处。

字段的生命周期等于拥有的对象,所以如果一个对象会继续存在一段时间,但是您知道不再需要字段引用,那么该字段可能允许早期的GC引用的对象。

是否打扰做这取决于拥有的对象将停留多久,以及被引用的对象有多大。这很少值得。

+0

如果转义分析证明引用永远不会退出范围,那么Object可以被GCed(或更具体地说*符合GC *),但是该字段的值本身可以被复制到另一个引用中,然后被使用。 – TheLostMind

0

设置对null的引用sorta帮助。如果这是对象的唯一引用,那么垃圾收集器可以自由地清理该对象的内存。充其量,你可以向垃圾收集器发出信号,好的时候是用System.gc()释放内存,但它最终仍然是一个建议,并不强制它。