我知道这可能看似重复,但我认为这个具体情况可能有点不同。
在我的MVC应用程序中,我有一个ViewModel,其中包含一个用于显示类似于Excel工作表的表的大型List。每个MyComplexClass都包含一个MyComplexClass列表和一个MyComplexColumn列表。
这会占用大量内存,但现在我遇到了问题。我应该编写一个方法来清理我的大表,并将一组不同的数据加载到其中。我可以这样写:
MyViewModel.Lines = new List<MyComplexClass>();
MyViewModel.LoadNewSetOfData(SetOfData);
但是,从C背景来看,明确地丢失我在旧列表上的引用并不是我能做的事情,并且每天早上继续在镜子里看着我的脸。
我看到了Here,Here和Here,我可以将引用设置为null,然后调用
GC.Collect()
但我被告知我不是最好的练习,特别是因为它可能会影响性能,而且因为我无法知道GC是否已经处理了这个特定的内存分配。
我有什么方法可以打电话给像Free()这样的东西吗?
谢谢
答案 0 :(得分:5)
只需加载不同的数据集。如果内存不足,GC将启动以回收内存而无需执行任何操作,如果有足够的可用内存,那么您将能够加载新的内存而不会受到影响。垃圾收集。
答案 1 :(得分:1)
简短的回答 - 不要担心垃圾收集。我唯一关心的是,如果你把大量的对象和数据放在一个他们可能根本无法正确收集垃圾的地方。例如,您在ASP.NET会话中存储了大量的每用户数据,即使用户访问了几页并离开,它也会在那里存在很长时间。
但是只要释放对象的引用(就像它们超出范围时那样),垃圾收集就会完成它的工作。它可能不完美,但它确实非常好。在大多数情况下开发良好垃圾收集的工作和思想可能超出了我们为开发应用程序本身所做的工作。
虽然我们有能力触发它,但.NET框架的设计故意让我们专注于更高级别的抽象,而不必担心内存被释放时的小细节。