对于大型或高流量的网站:
第一个问题:
将Object=null
(未释放)会释放内存吗?
还是有其他方式来释放内存?
第二个问题:
通常代码中是否需要明确释放内存?
对于大型或高流量的网站:
第一个问题:
将Object=null
(未释放)会释放内存吗?
还是有其他方式来释放内存?
第二个问题:
通常代码中是否需要明确释放内存?
someObject = null;
GC.Collect();
也许会有所帮助,但最好重构您的代码,以便您不会陷入这种情况。
如果您在对象超出范围之前执行此操作,则完全是多余的,并且会使事情变得更糟。如果您在finalizer中将内容设置为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);
将引用设置为 null 不会删除对象使用的内存,但最终会被垃圾回收。
假设您有两个对象 A 和 B,其中 A 引用 B。
如果不再存在对 A 的任何引用,则 A 和 B 都将被垃圾回收。清除 A 对 B 的引用是没有意义的。
但是,如果 A 是长寿命对象而且不再需要 B,那么清除对 B 的引用可能是值得的,这样可以使其被垃圾回收。
在 asp.net 的上下文中,您主要处理短寿命对象,因此通常不是问题。
将对象引用设置为null不会释放内存,但它会允许垃圾回收器在稍后的某个时间释放内存。
只要您持有对象的引用,它就不会被垃圾回收,但在正常的ASP.NET代码中,您很少需要考虑它,因为大多数对象只在请求期间被引用。当请求被垃圾回收时,大多数在其中创建的对象也将自动垃圾回收。
这个“软规则”的主要例外是静态或共享资源,如果保留引用可能导致它们在许多请求中存在并随着时间的推移而增加。换句话说,避免使用静态变量,您默认情况下大部分都会没问题。
我没有为非常高流量的网站或Web应用工作过。但是我有我的业务2业务门户和运行在Web上的实践管理系统,每天有大约1000-3000个访问量和并发用户。为此,我在所有层中都使用静态对象。考虑到公共静态变量,它给我带来了一些好处:
对象的清理我交给GC处理,因为GC会检查是否有任何孤立的对象,并自动释放其空间。
据我所知,对于你的问题: