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