【问题标题】:Is it necessary to release memory by set obj to null in c#? [duplicate]在c#中是否需要通过将obj设置为null来释放内存? [复制]
【发布时间】:2012-02-18 22:16:42
【问题描述】:

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

对于大型或高流量网站:

第一个问题:

设置Object=null(不是 Disposable )会释放内存吗? 还是有其他释放内存的方式?

第二个问题:

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

【问题讨论】:

  • 这并没有释放内存,它只是覆盖了一个指针。这已经被问过一千次了。
  • @delnan:我仍然认为这是一个合理的问题,因为在过去的 COM 中,您必须这样做才能释放引用计数。

标签: c# asp.net memory


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    如果您有实现 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 对象。

    【讨论】:

    • 此外,在方法的底部将这些变量设置为 null 被认为是一种去优化。您实际上是在与 JITter 和 GC 作斗争。 stackoverflow.com/a/2742867/47580
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      但是,如果 A 是一个长期存在的对象并且不再需要 B,则值得清除对 B 的引用,以便将其作为垃圾回收。

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

          1. 我需要更少的对象来创建,因为单个静态对象被共享
          2. 为以后的维护提供更简洁的代码。
          3. 静态 ctor 调用,因为它们被调用一次。

          对象清理,我留在 GC 上,因为 GC 会检查任何孤立对象并自动释放其空间。

          AFAIK,对于您的问题,

          1. 设置 null 将重置指针而不是释放内存。
          2. 在普通代码中释放内存不是强制性的,但从内存中删除所有不必要的对象以释放内存并让您的应用正常运行而不会出现任何问题是一种很好的做法。

          【讨论】:

          • Web 应用程序中的静态对象可能非常危险,因为它们是共享的,并且可以同时被多个线程访问。
          猜你喜欢
          • 2014-10-05
          • 1970-01-01
          • 2016-10-08
          • 2012-10-10
          • 2015-05-01
          • 2013-05-12
          • 2019-04-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多