2016-02-12 118 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()釋放內存,但它最終仍然是一個建議,並不強制它。