oli*_*i.G 6 .net c# garbage-collection memory-leaks
假设您有一个Collection<B>
,并且您即将删除一个项目.实例B
是从一个实例A
引用的,并引用了一个实例C
,如第一张图所示:
图A http://i43.tinypic.com/240wuqh.jpg
现在,由于存在指向B的引用,因此毫无疑问该对象被"删除"或被垃圾收集.它只是从集合中删除,就像这样,对吗?
图B http://i41.tinypic.com/4uxnp3.png
现在,让我们使用Collection<A>
与之前相同的引用层次结构,让我们删除A的实例.
图C http://i44.tinypic.com/1zd93dt.png
如果没有其他引用A
,不仅它从集合中删除,它被标记为垃圾.我对吗?并且怎么样B
和C
?它们是否也成为垃圾,除非B
引用一个实例,否则没有其他引用C
?
这是我所面临的简化.我想A
从集合中删除一个实例,我想确保B
并C
继续使用它.在A
我不再收集的地方,所有仍然活着的"孩子"对我来说都是记忆泄漏.
当我看到我制作的这些照片时,这个问题似乎太愚蠢了.但我的情况有点不那么微不足道.它看起来像这样:
图4 http://i41.tinypic.com/2ymhlq0.png
A Model
A Model
有一个B Model
实例集合(在Model和ViewModel层中B
都是一种子类A
)B Model
"知道它的父亲" - 引用其父"模型"实例我有这些A ViewModel
实例的集合.当我删除一个时,我需要其他所有内容.如果所涉及的任何实例没有其他"外部参考"(基本上,没有其他箭头指向图片外部),被移除的"ViewModel"实例是否会将所有孩子带走?如果是这样,是否有任何"陷阱"可以使这种简化误导?如果我完全错了,为什么?:)
感谢您阅读这篇文章!
Ree*_*sey 10
如果所涉及的任何实例没有其他"外部参考"(基本上,没有其他箭头指向图片外部),被移除的"ViewModel"实例是否会将所有孩子带走?
是的,如果您的代码没有引用给孩子,它将有资格进行垃圾收集,并且最终应该被收集.
如果没有其他对A的引用,不仅它从集合中删除,它被标记为垃圾.我对吗?
这实际上并不是这样的.GC不会"跟踪垃圾" - 而是从当前正在执行的代码中检查所有对象引用,然后走出去查找当前"活动"的引用.此时遗留的任何东西都不存在,然后才有资格收集.如果在图表中达到"B"或"C"的唯一方法是通过"A"的实例,并从集合中删除"A",则所有这些都将符合GC的条件,并且可以在下一个合适的GC收集.
归档时间: |
|
查看次数: |
407 次 |
最近记录: |