我正在阅读.Net垃圾收集器的性能,我正在为我的数据模型构建一组相互引用类。我已经实现了Delete()方法来从所有连接的对象中取消引用对象,确保该对象是可收集的。
虽然我目前不知道这对我的应用程序是否会成为一个问题,但我开始思考将被提升为后代然后删除的对象会发生什么。那么它们可能会在记忆中保留很长时间。
是否有可能告诉垃圾收集器在下一代Gen0集合期间应该“降级”并释放特定对象?
答案 0 :(得分:1)
除了删除对您调用GC.Collect
的对象的引用外,您无法手动与GC进行交互。
关于这句话:
虽然我目前不知道这对我的申请是否会有问题,但我开始考虑......
对于使用托管语言的GC,直到出现问题为止,请不要再考虑它了。如果您没有详细了解特定GC针对特定运行时使用的特定算法,那么您更有可能伤害应用程序的性能,而不是通过尝试修改来帮助它GC的默认行为。
答案 1 :(得分:1)
垃圾收集器可能的优化之一是尽可能长时间地将对象未引用的对象留在内存中,从而推迟收集,直到绝对必要。这样可以产生更少的集合,并且可以跨越更多的对象/内存来共享集合的成本。
如果您的对象在被取消引用后长时间保留在内存中,这真的是一个问题吗?如果您的机器有足够的可用内存,并且在解除引用后应用程序的占用空间没有增长,那么确实存在缺点吗?
收取成本是保证成本,而使用额外内存的成本并不确定 - 它可能会也可能不会影响您的程序/其他程序。这种优化的关键是我们放弃一定的成本来换取不确定的成本。