是否有必要通过在c#中将obj设置为null来释放内存
本文关键字:设置 obj null 内存 释放 中将 是否 | 更新日期: 2023-09-27 18:21:20
可能重复:
在.NET中使用后将对象设置为Null/Nothing
是否需要处理对象并将其设置为null?
对于大型或高流量网站:
第一个问题:
设置Object=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次点击,并发用户。为此,我在整个层中使用静态对象。牢记公共静态变量。,它给我的好处很少
- 我需要创建较少的对象,因为共享了一个静态对象
- 用于以后维护的清理器代码
- 静态actor调用,因为它们被调用一次
对象清理,我留在GC上,因为GC检查任何孤立对象并自动释放其空间。
AFAIK,对于您的问题,
- 设置null将重置指针,而不是释放内存
- 在正常代码中释放内存并不是强制性的,但从内存中删除所有不必要的对象是一种很好的做法,这样可以释放内存,让你的应用程序正常工作而不会出现任何问题