内存泄漏问题.net
我对编写代码的正确方法有点困惑。我读到我不必在变量中保留引用,因为垃圾收集不会清理它,但我不了解一些事情内存泄漏问题.net,.net,events,memory,memory-leaks,.net,Events,Memory,Memory Leaks,我对编写代码的正确方法有点困惑。我读到我不必在变量中保留引用,因为垃圾收集不会清理它,但我不了解一些事情 那么这个代码呢: private List<String> foo; public List<String> bar () { foo = new List<String>(); foo.add(something); return foo; } 私有列表foo; 公共列表栏() { foo=新列表(); 添加(某物); 返回f
private List<String> foo;
public List<String> bar ()
{
foo = new List<String>();
foo.add(something);
return foo;
}
私有列表foo;
公共列表栏()
{
foo=新列表();
添加(某物);
返回foo;
}
private void browser_navigating(Object sender, NavigatingEventargs e)
{
Uri someurl = new URI(something);
List<String> somelist = new List<String>();
}
private void浏览器\u导航(对象发送方,导航事件参数e)
{
urisomeurl=新的Uri(某物);
List somelist=新列表();
}
如果我有20个使用导航事件的webBrowser对象,它们会在触发导航事件时创建Uri和列表,对吗?但当我处理webBrowser时,事件中的对象会发生什么情况?他们会失去参考资料吗?当我处理一些东西时,这对他的所有孩子都有效,但对那些没有实现iDisposable(比如Uri和List)的对象也有效吗?所以它们是从垃圾中清理出来还是留在内存中
2.1。在释放注册该事件的对象之后,是否自动取消注册该事件
3) 我读到静态对象是内存泄漏的问题。
如果我需要多次使用一个类,并且每次需要将其声明为静态(例如,在我的例子中,我有一个静态连接类,其中包含登录和与Web服务器通信的方法,我声明静态(在我的mainWinform类中),因为我在其中存储了从登录接收到的cookies),该怎么办
谢谢你能回答我的问题
每次我调用bar方法时,旧的foo列表都会丢失引用,它将成为垃圾收集的候选对象
这可能是真的。赋值foo=new List
导致foo
停止指向上一个List
值。如果foo
是该对象的唯一的引用,则它将可用于收集。但是,如果类型中的另一个函数公开了该对象,那么它可能仍然是活动的。比如说
List<string> GetFoo() {
return foo;
}
List GetFoo(){
返回foo;
}
我读到静态对象是内存泄漏的问题
这部分是正确的。当一个对象引用在不再被积极使用后被GC根持有时,.Net中会发生内存泄漏。静态字段是GC根,这是一种麻烦的方法,因为它不像局部变量那样消失。静态场本质上永远保存着一个对象
class Holder {
public static List<string> StaticField;
}
Holder.StaticField = GetFoo();
类持有者{
公共静态列表静态字段;
}
Holder.StaticField=GetFoo();
最初存储在foo
中的列表
现在由静态字段
引用。在StaticField
指向另一个对象之前,它将在程序剩余部分的内存中保留列表
1:我应该在类的开头声明(并初始化)大部分变量,然后在方法内部使用after还是before和initialize
一般来说,一个对象在处理完后就应该超出范围。因此,如果它只在一个方法中使用,它应该是该方法的局部。对象的寿命越长,就越有可能在堆上升级到更高的一代。高代数据的收集成本更高,收集频率也更低。因此,尽快将对象移出范围通常会减少内存消耗,也会让程序运行得更快
2:但是当我处理webBrowser时,事件中的对象会发生什么情况?他们会失去参考资料吗?当我处理一些东西时,这对他的所有孩子都有效,但对那些没有实现iDisposable(比如Uri和List)的对象也有效吗?所以它们是从垃圾中清理出来还是留在内存中
当你处理一个物体时,它实际上是死的。任何其他对它有引用的人仍将拥有该引用,但如果他们试图对该对象进行任何操作,该对象将(或无论如何应该)引发一个ObjectDisposedException
对象的非托管资源(文件句柄、连接等)在释放时立即释放。它的非托管资源通常由垃圾收集器清理。因此,在对该对象的最后一次引用超出范围之前,它们不会被清除
3) 我读到静态对象是内存泄漏的问题
这是因为类的静态字段永远不会超出范围。因此,除非您显式地将其引用设置为null
或用其他内容替换它,否则无法清除它们引用的任何数据
最好分别使用web服务器处理每个会话。这不仅有助于垃圾收集器在您之后进行清理,而且还使您能够执行多个并发会话之类的操作