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

本文关键字:设置 obj null 内存 释放 中将 是否 | 更新日期: 2023-09-27 18:21:20

可能重复:
在.NET中使用后将对象设置为Null/Nothing
是否需要处理对象并将其设置为null?

对于大型或高流量网站:

第一个问题:

设置Object=null(非一次性)会释放内存吗?或者是另一种释放内存的方式?

第二个问题:

在正常代码中,如上所述显式释放内存是必要的吗?

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

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

如果您有一个实现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不会删除对象使用的内存,但最终会被垃圾回收。

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

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

但是,如果A是一个长寿命对象,并且不再需要B,那么清除对B的引用是值得的,这样它就会被垃圾回收。

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

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

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

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

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

您不会在垃圾回收环境中"释放"内存。从阅读这篇文章开始。

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

  1. 我需要创建较少的对象,因为共享了一个静态对象
  2. 用于以后维护的清理器代码
  3. 静态actor调用,因为它们被调用一次

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

AFAIK,对于您的问题,

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