当前位置:  开发笔记 > 编程语言 > 正文

与C#析构函数相关的成本(又名:终结者)?

如何解决《与C#析构函数相关的成本(又名:终结者)?》经验,为你挑选了2个好方法。

任何具有终结器的对象(我更喜欢该术语而非析构函数,以强调与C++析构函数的区别)都会添加到终结器队列中.这是一个对象的引用列表,这些对象具有在删除之前必须调用的终结器.

当对象用于垃圾收集时,GC将发现它在终结器队列中并将引用移动到可释放(f-reachable)队列.这是终结器后台线程依次调用每个对象的终结器方法的列表.

一旦调用了对象的终结器,该对象就不再位于终结器队列中,因此它只是GC可以删除的常规托管对象.

这意味着如果一个对象有一个终结器,它将至少存在一个垃圾收集,然后才能被删除.这通常意味着对象将被移动到下一个堆生成,这涉及实际将内存中的数据从一个堆移动到另一个堆.



1> Guffa..:

任何具有终结器的对象(我更喜欢该术语而非析构函数,以强调与C++析构函数的区别)都会添加到终结器队列中.这是一个对象的引用列表,这些对象具有在删除之前必须调用的终结器.

当对象用于垃圾收集时,GC将发现它在终结器队列中并将引用移动到可释放(f-reachable)队列.这是终结器后台线程依次调用每个对象的终结器方法的列表.

一旦调用了对象的终结器,该对象就不再位于终结器队列中,因此它只是GC可以删除的常规托管对象.

这意味着如果一个对象有一个终结器,它将至少存在一个垃圾收集,然后才能被删除.这通常意味着对象将被移动到下一个堆生成,这涉及实际将内存中的数据从一个堆移动到另一个堆.



2> plinth..:

关于这一切如何运作的最广泛的讨论是由Joe Duffy完成的.它有比你想象的更多的细节.

在此之后,我总结了一种实用的方法,在日常工作中做到这一点 - 少花钱,但更多的是实施.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有