在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