在Java中,当对象即将被垃圾回收并且不可访问时(前提是该对象覆盖了finalize方法),会调用finalize方法。但是如果finalizer使得对象再次可访问,那么会发生什么呢?
我正在尝试找出如何在C++/CLI中正确清理我的对象。 我已经阅读或浏览了这两篇文章(one, two),并查看了标准,还看了一些其他问题,特别是this one。 我有各种信息: 最终器应清理非托管资源(因此在对象进行垃圾回收时,所有内容都会被清理)。 析构函数应清理托管资源(删除 ...
《Effective Java》中说: 使用finalizer会造成严重的性能损失。 为什么使用finalizer来销毁一个对象会更慢呢?
我一直在思考为什么建议我们不要在finalize中释放托管资源。如果您查看http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx上的代码示例,并搜索字符串“Dispose(bool disposing) e...
我正在使用Microsoft.Interropt.Excel DLL编写Excel类。我完成了所有函数,但是在析构函数中出现了错误。我希望将所有更改保存到文件中并释放所有资源。我想在析构函数中完成这些操作。但是在我的析构函数中,Excel.ApplicationClass、Workbook和W...
根据这篇文章,在.Net中,终结器实际上比这更糟。除了它们运行缓慢(对于许多种资源确实是一个严重的问题)之外,它们还不够强大,因为它们只能执行析构函数允许的操作的一个子集(例如,终结器不能可靠地使用其他对象,而析构函数可以),即使在该子集中编写代码也极难正确处理。收集可终结对象也很昂贵:每个可...
如果在finalize调用期间保存当前对象的引用会发生什么?例如:class foo { ... public void finalize() { bar.REFERENCE = this; } } 这个对象是否被垃圾回收了?当您稍后尝试访问bar.RE...
我有一个应用程序,从一开始就经历缓慢的内存泄漏。 使用ANTS Memory Profiler,我可以看到所有泄漏的内存都被终结器队列的GC根持有。 我怀疑可能发生的是,终结器死锁等待锁变得可用。 我们的类都没有实现显式终结器,我们通常会避免使用它们,这让我认为锁可能与系统或库类相关。 ...
我一直认为答案是否定的,但我找不到任何说明。在我的类中,我能否在终结器(即ReleaseUnmanaged())中访问实例C的托管字段/属性?如果有限制,那是什么?GC或终结器会将这些成员设置为空吗?我唯一能找到的是终结器队列中的内容可以以任何顺序进行终结。所以,在这种情况下,既然建议是类型应...
我发现我维护的一些代码存在问题。下面的代码有一个private static SHA1成员(它是一个IDisposable,但由于它是static,因此永远不应该被完成)。然而,在压力下,这段代码会抛出一个异常,表明它已经关闭:Caught exception. Safe handle ha...