Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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#中将obj设置为null来释放内存?_C#_Asp.net_Memory - Fatal编程技术网

是否需要通过在c#中将obj设置为null来释放内存?

是否需要通过在c#中将obj设置为null来释放内存?,c#,asp.net,memory,C#,Asp.net,Memory,可能重复: 对于大型或高流量网站: 第一个问题: 设置Object=null(非一次性)是否会释放内存? 还是其他释放内存的方法 第二个问题: 在正常代码中是否需要如上所述显式释放内存?不,不是。如果对象不可处理,垃圾回收器会很好地处理它。另外,您没有释放内存,您正在修改一个变量。不,它不会立即这样做,而且不,如果您以正确的方式编写代码,它通常是不必要的 如果您有一个实现了IDisposable的资源,请在其上调用Dispose(),或者更好的方法是,使用(…)块将其放入中,这样会更快,并释

可能重复:

对于大型或高流量网站:

第一个问题:

设置
Object=null
(非一次性)是否会释放内存? 还是其他释放内存的方法

第二个问题:


在正常代码中是否需要如上所述显式释放内存?

不,不是。如果对象不可处理,垃圾回收器会很好地处理它。另外,您没有释放内存,您正在修改一个变量。

不,它不会立即这样做,而且不,如果您以正确的方式编写代码,它通常是不必要的

如果您有一个实现了
IDisposable
的资源,请在其上调用
Dispose()
,或者更好的方法是,使用(…)块将其放入
中,这样会更快,并释放适当的资源。如果在同一范围内有多个大型对象不是COM对象或未实现某种形式的处置机制,请执行以下操作:

someObject = null;
GC.Collect();
这可能会有所帮助,但您最好重新构造代码,以免出现这种情况

如果在对象超出范围之前执行此操作,则这是完全多余的,并且会使事情变得更糟。如果在终结器中设置为
null
,则情况会更糟。例如,永远不要这样做:

public void aFunction() {
    SomeThing anObject = new SomeThing();
    // ...
    anObject = null;
}
这也不是:

public ~MyClass() {
    this.Something = null; // WRONG!
    this.SomethingElse.Dispose(); // DANGEROUS!
    this.SomeObject.Notify("I got finalized!"); // ALSO DANGEROUS!
}

为了完整起见,您可以这样做:

Marshal.ReleaseComObject(someObj);

释放COM对象。

在垃圾收集环境中不会“释放”内存。从读取开始。

将引用设置为null不会删除对象使用的内存,但它最终会被垃圾回收

假设有两个对象A和B,其中A引用了B

如果不再有对A的任何引用,那么A和B都将被垃圾收集。把A和B的关系弄清楚是没有意义的

但是,如果A是一个长期存在的对象,并且不再需要B,那么清除对B的引用是值得的,这样它将被垃圾收集


在asp.net的上下文中,您将主要处理短期对象,因此这通常不是问题。

将对象引用设置为null不会释放内存,但它将允许垃圾收集器在稍后释放内存

只要您持有对对象的引用,它就不会被垃圾收集,但在普通ASP.NET代码中,您很少需要考虑它,因为大多数对象只在请求期间被引用。当请求被垃圾收集时,在请求期间创建的大多数对象也将被自动垃圾收集


这种“软规则”的主要例外是静态或共享资源,在这些资源中,留下引用可能会导致它们在许多请求中存活,并随着时间的推移而累积。换言之,避免使用静态变量,默认情况下你会很好。

我没有为流量非常大的网站或web应用工作过。但我的business 2 business portal和Practice Management系统运行在web上,每天有1000-3000个并发用户访问。为此,我在整个层中使用静态对象。记住公共静态变量。这对我没什么好处

  • 我需要创建较少的对象,因为单个静态对象会被共享
  • 更干净的代码用于以后的维护
  • 静态构造函数调用,因为它们只调用一次
  • 对象清理,我留在GC上,因为GC检查任何孤立对象并自动释放其空间

    好了,谢谢你的提问

  • 设置null将重置指针,而不是释放内存
  • 在普通代码中释放内存不是强制性的,但从内存中删除所有不必要的对象是一个很好的做法,这样可以释放内存,让你的应用程序正常工作而不会出现任何问题

  • 这并没有释放内存,它只是覆盖了一个指针。这一问题以前已经被问过一千次了。@delnan:我仍然认为这是一个合理的问题,因为在旧的COM时代,必须这样做才能释放引用计数。web应用程序中的静态对象可能非常危险,因为它们是共享的,并且可以由多个线程同时访问。此外,在方法底部将这些变量设置为null被认为是一种非优化。您正在有效地对抗抖动和GC。