如果一个对象有5个引用,那么该对象能够找出引用他的内容? 因为我知道Java(希望C#
)有一个GC列表。谁知道我? (对象编年史)
2
A
回答
8
不,没有“参考文献列表”。 GC不需要知道引用对象的所有内容 - 它只需知道是否引用任何对象。
作为GC的一个非常粗糙的模型,它将堆中的每个对象都标记为垃圾,然后查看它认为是非垃圾(“根”对象)的对象。例如,它会查看每个线程的堆栈以及线程中的每个实例方法,它通常会将目标实例标记为非垃圾文件。
然后它会经过每个根,看看哪些对象那些那些指的是...并将它们标记为非垃圾。它会缓解下来,找到它所能做的一切。然后可以收集(或确定)任何未被标记为非垃圾的东西。
从这个算法中可以看出,GC不需要为每个对象保留一个完整的引用列表 - 只是说一些“垃圾”或“非垃圾”。
很显然,在Java和.NET中,GC比这个复杂得多,世代垃圾回收器和各种策略可以最大限度地减少GC“暂停”并为GC使用多线程。希望这个简化的视图足以解释为什么甚至GC也没有引用列表。
并不总是,在.NET的情况下。一个对象可以被垃圾回收,而实例方法仍然在“运行”它,如果该方法没有引用从当前点向前的对象中的任何字段。
0
如果您无法为此找到语言支持,只需让每个想要持有对所讨论对象的引用的对象都调用一个方法,告诉正在引用的对象。然后该对象将引用对象添加到列表中。每当您放弃对该对象的引用时,就会调用另一种方法从列表中删除引用者。
相关问题
- 1. 谁知道unix fork的历史?
- 2. 有谁知道ASP.NET Webforms的历史?
- 3. 知道是谁锁定的对象
- 4. 谁应该知道对方?
- 5. 编年史问题?难道我做错了什么?
- 6. 我如何知道谁访问了phpmyadmin
- 7. 谁知道Sedgewick-Vitter算法?
- 8. 使用计时器知道对象的年龄
- 9. 有谁知道TIdHTTP的缓存组件?
- 10. 有谁知道浏览器模拟器?
- 11. 有谁知道使用PHP和卷曲
- 12. 有谁知道任何精灵集合?
- 13. 我如何知道谁签出了这份工作副本?
- 14. 有谁知道sed -i的实现?
- 15. sql-server:我如何知道谁在我的数据库中?
- 16. 有谁知道'LINQ to XLSX'提供者?
- 17. 如何知道谁在页面上?
- 18. 有没有一种方法可以知道谁拥有对象的引用?
- 19. 有谁知道嵌入式pdf对象的jQuery放大插件吗?
- 20. 谷歌云存储 - 知道谁上传
- 21. 有谁知道MIPS在线IDE或编译器?
- 22. 有谁知道如何编写这个正则表达式?
- 23. Flex:有谁知道一个好的HTML编辑器?
- 24. 有谁知道用于编码Orkut的语言?
- 25. 有谁知道一个好的MAML编辑器
- 26. 有谁知道如何在Ubuntu上编译Megahal?
- 27. 有谁知道电脑编程工作模式的网站?
- 28. 有谁知道Flex的常见编程约定?
- 29. 我如何知道谁发送了WAMP消息?
- 30. 从编年史地图玩具代码
很快就会变成病毒......因为现在一个对象需要知道什么时候它将被垃圾收集,以便它可以自行移除。你要么终结一切都有终结者,要么到处都有大量的代码来执行家务管理。 – 2010-06-26 07:14:16
多数民众赞成在即时尝试避免! 这是要变得沉重! 与他们之间的一些链接im计划与10000对象和期望的模型。 如果生病只是在他们的名单上,它可以是一个100000的开销到一个密尔参考 – kalix 2010-06-26 07:18:45
@kalix:那么你应该重新设计,以便你不需要知道“父母”。 – 2010-06-26 07:26:44