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

时间:2012-01-25 17:57:20

标签: c# asp.net memory

  

可能重复:
  Setting Objects to Null/Nothing after use in .NET
  Do you need to dispose of objects and set them to null?

适用于大型或高流量网站:

第一个问题:

会设置Object=null(不是Disposable)释放内存吗? 或者是释放记忆的其他方式?

第二个问题:

在普通代码中是否需要显式释放内存?

6 个答案:

答案 0 :(得分:6)

不,它不会立即执行,不,如果您以正确的方式编写代码通常是不必要的。

如果您有一个实施IDisposable的资源,请在其上调用Dispose(),甚至更好,将其放在using(...)块中 - 它会更快,释放适当的资源。如果同一作用域中有多个大对象不是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对象。

答案 1 :(得分:2)

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

假设您有两个对象A和B,A引用B。

如果不再引用A,则A和B都将被垃圾收集。清除A对B的引用毫无意义。

但是,如果A是一个长期存在的对象并且不再需要B,则可以清除对B的引用,以便对其进行垃圾收集。

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

答案 2 :(得分:1)

不,不是。如果对象不可丢弃,垃圾收集器会很好地处理它。此外,您没有释放内存,而是在修改变量。

答案 3 :(得分:1)

您不会在垃圾收集环境中“释放”内存。首先阅读this

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

我没有为一个非常繁忙的交通网站或网络应用程序工作。但我在网络上运行我的业务2业务门户和实践管理系统,我每天与并发用户一起获得大约1000-3000次点击。为此我在整个层中使用静态对象。记住公共静态变量。它给我的好处很少,

  1. 我需要创建较小的对象,因为单个静态对象可以共享
  2. 以后维护的清洁代码。
  3. 静态ctors调用,因为它们被调用一次。
  4. 对象清理,我离开GC,因为GC检查任何孤儿对象并自动释放其空间。

    AFAIK,您的问题,

    1. 设置为null将重置指针,而不是释放内存。
    2. 您不必在正常代码中释放内存,但最好从内存中删除所有不必要的对象,以便释放内存并让您的应用程序正常运行而不会出现任何问题。