任何具有终结器的对象(我更喜欢该术语而非析构函数,以强调与C++析构函数的区别)都会添加到终结器队列中.这是一个对象的引用列表,这些对象具有在删除之前必须调用的终结器.
当对象用于垃圾收集时,GC将发现它在终结器队列中并将引用移动到可释放(f-reachable)队列.这是终结器后台线程依次调用每个对象的终结器方法的列表.
一旦调用了对象的终结器,该对象就不再位于终结器队列中,因此它只是GC可以删除的常规托管对象.
这意味着如果一个对象有一个终结器,它将至少存在一个垃圾收集,然后才能被删除.这通常意味着对象将被移动到下一个堆生成,这涉及实际将内存中的数据从一个堆移动到另一个堆.
任何具有终结器的对象(我更喜欢该术语而非析构函数,以强调与C++析构函数的区别)都会添加到终结器队列中.这是一个对象的引用列表,这些对象具有在删除之前必须调用的终结器.
当对象用于垃圾收集时,GC将发现它在终结器队列中并将引用移动到可释放(f-reachable)队列.这是终结器后台线程依次调用每个对象的终结器方法的列表.
一旦调用了对象的终结器,该对象就不再位于终结器队列中,因此它只是GC可以删除的常规托管对象.
这意味着如果一个对象有一个终结器,它将至少存在一个垃圾收集,然后才能被删除.这通常意味着对象将被移动到下一个堆生成,这涉及实际将内存中的数据从一个堆移动到另一个堆.
关于这一切如何运作的最广泛的讨论是由Joe Duffy完成的.它有比你想象的更多的细节.
在此之后,我总结了一种实用的方法,在日常工作中做到这一点 - 少花钱,但更多的是实施.