为什么用空的lambda函数注册事件会在内存中引起强烈引用?

莱特曼

有一些示例代码:

public class Publisher
    event Published()
end class

public class Subscriber
    public sub new(Publisher as Publisher)
        addhandler Publisher.Published,
            sub()

            end sub
    end sub
end class
  1. 即使将未捕获的空lambda函数作为事件处理程序传递,PublisherSubscriber构造函数中注册该事件是否也可以防止Subscriber垃圾回收Subscriber

  2. 在C#中是否一样?

编辑

一个简单的控制台应用程序对其进行测试:

Sub Main()

    Dim Publisher As New Publisher

    For i = 1 To 1000000
        Dim Subscriber As New Subscriber(Publisher)
    Next

    GC.Collect()
    Dim TotalMemory = GC.GetTotalMemory(True)

    Trace.WriteLine(TotalMemory)
End Sub

不幸的是,垃圾回收后该应用程序消耗了36 MB的内存,这意味着所有订阅服务器都保留在内存中

在不同的目标框架2.0、3.0、3.5、4.0、4.5上进行调试和发布会得到相同的结果。

  1. 任何人都可以重现该问题或解释为什么添加事件处理程序可以正常工作吗?
EVK

如果您在匿名函数中未引用任何与Subscriber相关的内容,则它将被编译为Subscriber类的静态方法,因此,它不会阻止垃圾回收Subscriber类的任何实例。您可能需要查看此链接-http://blogs.msdn.com/b/oldnewthing/archive/2006/08/02/686456.aspx-了解更多信息。

更新。下面的代码显示了在Release模式下运行时总内存的几乎相同的值(在Debug模式下,确实如您所说的那样工作):

internal class Program {
    private static void Main(string[] args) {
        Console.WriteLine("Before: {0}", GC.GetTotalMemory(true));
        var pub = new Publisher();
        for (int i = 0; i < 1000000; i++) {
            var sub = new Subscriber(pub);
        }
        GC.Collect();
        Console.WriteLine("After: {0}", GC.GetTotalMemory(true));
        Console.ReadKey();
    }
}

public class Publisher {
    public EventHandler Published;
}

public class Subscriber {
    public Subscriber(Publisher pub) {
        pub.Published += delegate { };
    }        
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么用send_data发送的对象似乎保留在内存中?

来自分类Dev

为什么用 lambda 函数来定义这个函数?

来自分类Dev

JavaScript 中是否会在内存中执行空体函数?

来自分类Dev

为什么用operator =引用但不能用构造函数引用?

来自分类Dev

new / malloc是否会在内存充足但零散的环境中引起内存混乱?

来自分类Dev

为什么一个空的ERB文件会在Ruby 1.8.7中引起警告?

来自分类Dev

为什么用void与函数?

来自分类Dev

为什么用void与函数?

来自分类Dev

为什么用一个空对象扩展一个函数?

来自分类Java

为什么用Java打印阵列内存位置?

来自分类Dev

为什么此代码会在Java中引起ConcurrentModificationException?

来自分类Dev

为什么这会在以后的运行中引起错误?

来自分类Java

为什么用JPA不能更改实体的引用对象?

来自分类Dev

为什么在此代码示例中,即使引用未引用对象,引用为什么在内存中也有大小?

来自分类Dev

为什么用角使我的输入字段为空?

来自分类Dev

为什么用dtype = str的空DataFrame填充“ n”?

来自分类Dev

理解函数参数声明中的 Go 指针:为什么用 * 而不是 &?

来自分类Dev

为什么用通用或R值引用调用重载的重写函数是模棱两可的?

来自分类Dev

为什么在performBatchUpdates中强烈引用父UIViewController会泄漏活动?

来自分类Dev

为什么用这种方式处理成员函数?

来自分类Dev

为什么用函数获取记录而不是表?

来自分类Dev

弱事件模式中的 RemoveHandler 有什么用?

来自分类Dev

对象解构和散布运算符会在内存中创建新的引用吗?

来自分类Dev

为什么可以在内部函数成员中访问对象引用,而不能在内部属性成员中访问对象引用?

来自分类Python

为什么元组在内存中的空间比列表少?

来自分类Dev

JVM为什么要在内存中重定位对象?

来自分类Dev

为什么堆栈和堆在内存中如此分离?

来自分类Dev

为什么UIViewController会保留在内存中

来自分类Dev

为什么用HashMap中的键检索这些值?

Related 相关文章

  1. 1

    为什么用send_data发送的对象似乎保留在内存中?

  2. 2

    为什么用 lambda 函数来定义这个函数?

  3. 3

    JavaScript 中是否会在内存中执行空体函数?

  4. 4

    为什么用operator =引用但不能用构造函数引用?

  5. 5

    new / malloc是否会在内存充足但零散的环境中引起内存混乱?

  6. 6

    为什么一个空的ERB文件会在Ruby 1.8.7中引起警告?

  7. 7

    为什么用void与函数?

  8. 8

    为什么用void与函数?

  9. 9

    为什么用一个空对象扩展一个函数?

  10. 10

    为什么用Java打印阵列内存位置?

  11. 11

    为什么此代码会在Java中引起ConcurrentModificationException?

  12. 12

    为什么这会在以后的运行中引起错误?

  13. 13

    为什么用JPA不能更改实体的引用对象?

  14. 14

    为什么在此代码示例中,即使引用未引用对象,引用为什么在内存中也有大小?

  15. 15

    为什么用角使我的输入字段为空?

  16. 16

    为什么用dtype = str的空DataFrame填充“ n”?

  17. 17

    理解函数参数声明中的 Go 指针:为什么用 * 而不是 &?

  18. 18

    为什么用通用或R值引用调用重载的重写函数是模棱两可的?

  19. 19

    为什么在performBatchUpdates中强烈引用父UIViewController会泄漏活动?

  20. 20

    为什么用这种方式处理成员函数?

  21. 21

    为什么用函数获取记录而不是表?

  22. 22

    弱事件模式中的 RemoveHandler 有什么用?

  23. 23

    对象解构和散布运算符会在内存中创建新的引用吗?

  24. 24

    为什么可以在内部函数成员中访问对象引用,而不能在内部属性成员中访问对象引用?

  25. 25

    为什么元组在内存中的空间比列表少?

  26. 26

    JVM为什么要在内存中重定位对象?

  27. 27

    为什么堆栈和堆在内存中如此分离?

  28. 28

    为什么UIViewController会保留在内存中

  29. 29

    为什么用HashMap中的键检索这些值?

热门标签

归档