Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存泄漏问题.net_.net_Events_Memory_Memory Leaks - Fatal编程技术网

内存泄漏问题.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;
    }
    
  • 每次我调用bar方法时,旧的foo列表都会丢失引用,它将成为垃圾收集的候选对象?我应该在类的开头声明(并初始化)大部分变量,然后在方法内部使用after还是declare before并初始化

    二,。 处置的对象呢?如果我写这个代码

    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服务器处理每个会话。这不仅有助于垃圾收集器在您之后进行清理,而且还使您能够执行多个并发会话之类的操作