终结句柄保留在内存中。如何删除此引用?
finalization handle remains in the memory. how to remove this reference?
我需要在内存使用方面优化我的应用程序。所以我使用了 .net 性能分析器...
但是我的应用程序中的一些引用仍然存在,并且即使我强制它收集也永远不会被 GC 收集。
活着的引用是 "finalization handle" 类型。
我不知道如何删除这种引用....请帮助。
这不是内存泄漏,只是 AMProLibrary 作者的编码草率。
如您所见,探查器告诉您引用的 object 是 "Finalization Handle" 类型。这意味着它来自终结器 queue。终结器 queue 是 .NET 垃圾收集器用来保存所有实现终结器方法的 object 的东西。 finalizer 是用来确保非托管资源在垃圾期间被正确释放的机制collection。包含非托管资源的 object 实现 IDisposable
模式,包括 Finalize
方法,这是释放非托管资源的地方。当垃圾收集器处理 "finalizable" objects(由 object 的 header 中的位值指示)时,它将它们移动到终结器 queue.在 collection 期间,GC 遍历终结器 queue 并在每个 object 上调用 Finalize
方法。
库的作者显然没有做的是从 Dispose
方法中调用 GC.SuppressFinalize()
。这通常通过清除 object 的 header 中的 "finalizable" 位从终结器 queue 中删除 object,并指示 Finalize
方法不需要调用。
出于测试目的,您可以通过调用 GC.WaitForPendingFinalizers
函数强制终结器 运行。例如:
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.GC.Collect();
但是,您实际上不应在生产应用程序中使用这样的代码。强制 collection 很少有意义。这正好证明了上述假设的有效性。
一般来说,您不应该依赖终结器来释放非托管资源。所有实现 IDisposable
的 object 都应由您的代码显式处理,方法是手动调用 Dispose
方法,或者最好将其创建包装在 using
块中当退出块的范围时,将自动调用 Dispose
。
我需要在内存使用方面优化我的应用程序。所以我使用了 .net 性能分析器... 但是我的应用程序中的一些引用仍然存在,并且即使我强制它收集也永远不会被 GC 收集。
活着的引用是 "finalization handle" 类型。 我不知道如何删除这种引用....请帮助。
这不是内存泄漏,只是 AMProLibrary 作者的编码草率。
如您所见,探查器告诉您引用的 object 是 "Finalization Handle" 类型。这意味着它来自终结器 queue。终结器 queue 是 .NET 垃圾收集器用来保存所有实现终结器方法的 object 的东西。 finalizer 是用来确保非托管资源在垃圾期间被正确释放的机制collection。包含非托管资源的 object 实现 IDisposable
模式,包括 Finalize
方法,这是释放非托管资源的地方。当垃圾收集器处理 "finalizable" objects(由 object 的 header 中的位值指示)时,它将它们移动到终结器 queue.在 collection 期间,GC 遍历终结器 queue 并在每个 object 上调用 Finalize
方法。
库的作者显然没有做的是从 Dispose
方法中调用 GC.SuppressFinalize()
。这通常通过清除 object 的 header 中的 "finalizable" 位从终结器 queue 中删除 object,并指示 Finalize
方法不需要调用。
出于测试目的,您可以通过调用 GC.WaitForPendingFinalizers
函数强制终结器 运行。例如:
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.GC.Collect();
但是,您实际上不应在生产应用程序中使用这样的代码。强制 collection 很少有意义。这正好证明了上述假设的有效性。
一般来说,您不应该依赖终结器来释放非托管资源。所有实现 IDisposable
的 object 都应由您的代码显式处理,方法是手动调用 Dispose
方法,或者最好将其创建包装在 using
块中当退出块的范围时,将自动调用 Dispose
。