在Java中,finalize
在對象(即覆蓋它)時被調用,當它將要被垃圾回收時,所以當它無法訪問時。但是如果終結器使對象再次可達,那麼會發生什麼?如果終結器使對象可達,該怎麼辦?
回答
該對象不會被收集,直到它再次無法到達。
根據JavaDoc,不會再次調用finalize()。
是的,這就是爲什麼你不使用終結器(嗯,原因之一)。
有一個參考集合是做這個東西。我會查找它並在一秒內發佈,但我認爲它是PhantomReference。
沒錯,PhantomReference:
幻影參考對象,其集電極之後排隊確定其指示可以以其它方式回收。幻影引用最常用於以比Java最終化機制更靈活的方式安排驗屍前清理操作。
如果仔細閱讀API說明,您會看到終結器可以使對象再次可達。該對象不會被丟棄,直到它不可用(再次),但finalize()
將不會被調用多次。
實際上,終結器*通過在發現對象無法訪問的時間與運行終結器的時間之間的根引用,可以強制實現對象的可達性。如果在那段時間被發現無法訪問的對象成爲對某個其他對象的唯一存活引用,那麼在終結器運行或該引用通過其他方式失效後,該另一個對象將不可收集。 – supercat 2013-02-26 01:07:41
然後該對象基本上不會被垃圾收集。這叫做對象復活。執行搜索該術語,你應該得到一堆有趣的文章。正如Jim所說,重要的一點是終結者只能運行一次。
它實際上做了另一次檢查並確保沒有更多的對象引用。由於它的第二遍測試會失敗,所以最終不會釋放對象的內存。
因爲對於任何給定的對象,finalize只被調用一次,所以下一次沒有引用時,它只會釋放內存而不調用finalize。最終確定一些好的信息here。
- 1. 如果collections.defaultdict不可用,該怎麼辦?
- 2. 該怎麼辦抵達件
- 3. 如果對象在Handlebars.js中只有一個值,該怎麼辦?
- 4. 如果我正在等待一個不可運行的對象,該怎麼辦?
- 5. 如果拋出IOException,我該怎麼辦?
- 6. 如果setuptools未安裝,該怎麼辦?
- 7. 如果google.load失敗,該怎麼辦?
- 8. 如果DBCursor未關閉,該怎麼辦?
- 9. 如果mysql_query()失敗,該怎麼辦?
- 10. 如果_POSIX_VDISABLE值爲-1,該怎麼辦?
- 11. 如果我需要從線程的可運行對象返回一個對象,該怎麼辦?
- 12. 如果gc是可選的,該怎麼辦?
- 13. 如果maven artifact不再可用,該怎麼辦?
- 14. 如果外部存儲不可用,該怎麼辦?
- 15. typescript:如果typings(或tsd)不可用,該怎麼辦?
- 16. 我該怎麼辦?
- 17. com.mysql.jdbc.Driver該怎麼辦?
- 18. NullPointerException - 該怎麼辦?
- 19. 我該怎麼辦這個效果?
- 20. 如果屬性路徑中的父對象爲空,該怎麼辦?
- 21. A ParameterizedThreadStart問題:如果一個方法返回一個對象,該怎麼辦?
- 22. 如果Flex Builder 3調試器無法啓動,該怎麼辦
- 23. 如果型號與控制器命名不符,該怎麼辦?
- 24. rethinkdb集羣,如果某些服務器關閉,該怎麼辦?
- 25. 給出錯誤的結果,我該怎麼辦?
- 26. SQL幫助從空虛的結果中獲得結果,該怎麼辦?
- 27. 如果我不能使用// = require_tree,我該怎麼辦?
- 28. 如果ASCII使用每個字符12位,該怎麼辦?
- 29. 如果我的Chromecast AppID無法使用,該怎麼辦?
- 30. 如果我不使用Laravel Homestead,該怎麼辦?
不,這是爲什麼不寫一個非常糟糕的finaliser(如果沒有足夠的其他原因)。 – 2010-09-29 00:14:40