Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显式释放内存_C#_Asp.net_Memory Management - Fatal编程技术网

C# 显式释放内存

C# 显式释放内存,c#,asp.net,memory-management,C#,Asp.net,Memory Management,我知道这看起来像是重复的,但我认为这个具体案例可能有点不同 在我的MVC应用程序中,我有一个ViewModel,其中包含一个大列表,用于显示类似Excel工作表的表格。每个MyComplexClass都包含一个MyComplexClass列表和一个MyComplexColumn列表 这会占用大量内存,但现在我遇到了一个问题。我应该编写一个方法来清理我的大表,并向其中加载一组不同的数据。我可以这样写: MyViewModel.Lines = new List<MyComplexCla

我知道这看起来像是重复的,但我认为这个具体案例可能有点不同

在我的MVC应用程序中,我有一个ViewModel,其中包含一个大列表,用于显示类似Excel工作表的表格。每个MyComplexClass都包含一个MyComplexClass列表和一个MyComplexColumn列表

这会占用大量内存,但现在我遇到了一个问题。我应该编写一个方法来清理我的大表,并向其中加载一组不同的数据。我可以这样写:

    MyViewModel.Lines = new List<MyComplexClass>();
    MyViewModel.LoadNewSetOfData(SetOfData);
但有人告诉我,我并不是真正的最佳实践,特别是因为它可能真的会影响性能,并且因为我无法知道GC是否已经处理了这个特定的内存分配

难道我就没有办法调用像Free()这样的东西继续生活吗


谢谢

别担心!试图“鼓励”垃圾收集器回收内存不是一个好主意——让它在后台工作就行了


只需加载不同的数据集。如果内存越来越少,GC将启动来回收内存,而您无需做任何事情,如果有足够的内存可用,那么您将能够加载新的集合,而无需进行垃圾收集。

简短的回答-不必担心垃圾收集。我唯一担心的是,如果你把大量的对象和数据放在一个可能根本无法正确收集垃圾的地方。例如,您在ASP.NET会话中存储了大量每个用户的数据,即使用户访问了几页并离开了,这些数据也会在那里停留很长时间

但只要对象的引用被释放(比如当它们超出范围时),垃圾收集就会完成它的工作。它可能并不完美,但它真的,真的很好。在大多数情况下,开发良好的垃圾收集所做的工作和思想可能超过了我们开发应用程序本身所做的工作


尽管我们有触发它的能力,.NET framework的设计有意让我们专注于更高级别的抽象,而不必担心更小的细节,比如内存释放的时间。

继续生活,让GC完成它的工作。“这会造成相当大的内存使用”-那么,你是真的忘记了还是只是担心?如果第二种选择——只是不认真对待它,GC在大多数情况下都会做得很好。是的,GC在它的工作上比你做得更好,不显式释放内存一点也不丢脸。我只是不明白为什么我自己不能做。我可以理解为什么当你出现不必要的内存泄漏时使用GC是有用的,但是如果我知道我不会使用这个空间,我应该能够告诉系统“嘿,伙计,你可以收回它,我不再需要它了”@MarrowGnawer-“我可以理解当你出现不必要的内存泄漏时使用GC是有用的”-不,不需要,因为GC无法消除不必要的内存泄漏。GC非常擅长确保它摆脱不再被引用的对象(这些对象不是泄漏)。如果存在泄漏,则必须显式处理非托管内存。因此,在c#中绝对没有办法释放内存空间?我的意思是,除了用C写一个dll,然后在我的C代码中调用它之外?@MarrowGnawer-也许问题是你为什么这么担心释放内存?@MarrowGnawer-我知道,我也去过那里!但是相信我,放松点,学会相信垃圾收集器!
GC.Collect()