1

我有一个设计,但我不确定垃圾收集是否会正确进行。
我有一些神奇的苹果,有些很好吃,有些很糟糕。

我有一本字典:(BasketList = Dictionary <basketID,Basket>
篮子清单)。

每个Basket对象都有一个对象,每个对象AppleBasket存储一个对对象的引用AppleSeperation

AppleSeperation 存储 2 个字典,YummyApples = <basketID,Apple>并且 BadApples = Dictionary<basketID,Apple>,所以当我被问到苹果在哪里时,我知道。

一个Apple对象 stores BasketsImIn = Dictionary<ID,Basket>,它指向 Basket 和 in Shops,以及 Apple in Basket。

我的问题是,如果我从中删除一个篮子BasketList并确保我从中删除 AppleBadApples和/或YummyApples,垃圾收集会正确进行,还是会有一些乱七八糟的引用?

4

2 回答 2

2

您仔细考虑这一点是对的;拥有各种引用不仅对垃圾收集有影响,而且对您的应用程序的正常运行也有影响。

但是,只要您小心地删除您设置的所有引用,并且您没有任何其他独立变量持有该引用,垃圾收集器就会完成它的工作。

GC 在收集未引用对象方面实际上相当复杂。例如,它可以收集两个相互引用但在应用程序中没有其他“活动”引用的对象。

于 2012-04-20T11:13:04.117 回答
1

有关垃圾收集的基础知识,请参阅http://msdn.microsoft.com/en-us/library/ee787088.aspx

从上面的链接中,当垃圾收集发生时......

  1. 系统物理内存不足。
  2. 托管堆上分配的对象使用的内存超过了可接受的阈值。这意味着已超过托管堆上可接受的内存使用量的阈值。随着流程的运行,此阈值会不断调整。
  3. GC.Collect 方法被调用。在几乎所有情况下,您都不必调用此方法,因为垃圾收集器会持续运行。此方法主要用于特殊情况和测试。

如果您正确执行清理,那么您不必担心!

于 2012-04-20T11:13:02.650 回答