Tag: garbage collection

c#finalizer抛出exception?

从MSDN引用: 如果Finalize或Finalize的覆盖引发exception,则运行时将忽略该exception,终止该Finalize方法,并继续完成最终化过程。 但如果我有: ~Person() { throw new Exception(“meh”); } 然后它会导致运行时exception? ps我知道这绝不会发生,但我只是对这种行为感到好奇。 我们的一个客户有一个空的尝试捕获他们的所有终结器..它甚至没有记录出错或重新对象:/

关闭SqlConnection和SqlCommand c#

在我的DAL中,我写这样的查询: using(SQLConnection conn = “connection string here”) { SQLCommand cmd = new (“sql query”, conn); // execute it blah blah } 现在我发现我没有明确关闭SQLCommand对象。 现在我知道’using’块将处理SQLConnection对象,但这还会处理SQLCommand对象吗? 如果不是我有一个严重的问题。 我必须在SQLCommand上使用’使用’成千上万行代码,或者在数百种方法上执行cmd.Close()。 请告诉我,如果使用或关闭命令将提供更好的Web应用程序内存管理?

调试.NET内存泄漏 – 如何知道什么是什么?

我正在开发一个似乎存在内存泄漏的.NET应用程序。 我知道教科书的答案,事件应该取消订阅,一次性物品应该处理等… 我有一个可以重现错误的测试工具。 在某个类的终结器中,我写入控制台 public class Foo { // Ctor public Foo() { } ~public Foo() { Console.WriteLine(“Foo Finalized”); } } 在测试工具中,我创建了一个Foo实例(它反过来创建并与数百种其他类型交互)然后删除它并调用垃圾收集器。 我发现从未调用过Foo Finalizer。 我有一个类似的类与此设置,最终确定为控制测试。 所以我的问题是: 我怎样才能确定使用商业或开源工具究竟是什么引用了Foo? 我拥有dotTrace Memory Profiler的专业许可,但无法从帮助文件中找出如何使用它。 更新:我现在使用dotMemory 4.0 ,这是(好的,但无法使用的)dotTrace Memory 3.5的inheritance者。

在C#中正确处理COM互操作对象,尤其是MS Office应用程序

我正在开发一个依赖于多个Microsoft Office产品的应用程序,包括Access,Excel,Word,PowerPoint和Outlook等。 在对互操作进行研究时,我发现从VS2010和.NET 4开始,我们感谢不再需要经历PIA的噩梦。 此外,我一直在阅读很多关于妥善处理物品的文章,最明智的就是这个 。 然而,该文章已有5年历史,关于AFAIK主题的权威出版物并不多。 以下是上述链接中的代码示例: ‘ Cleanup: GC.Collect() GC.WaitForPendingFinalizers() GC.Collect() GC.WaitForPendingFinalizers() Marshal.FinalReleaseComObject(worksheet) oWB.Close(SaveChanges:=False) Marshal.FinalReleaseComObject(workbook) oApp.Quit() Marshal.FinalReleaseComObject(application) 我想知道的是今天的标准,如果我希望在未来几年支持我的申请,我应该注意什么? 更新:一些可靠文章的链接将受到高度赞赏。 顺便说一句,这不是服务器端应用程序。 这将在计算机实验室中运行,我们让用户与我们实例化的办公产品进行交互。 发现它: 这篇由三部分组成的文章可能是最接近我期望找到的权威帐户的文章。

为什么GC在我引用它时会收集我的对象?

让我们看一下显示问题的以下片段。 class Program { static void Main(string[] args) { var task = Start(); Task.Run(() => { Thread.Sleep(500); Console.WriteLine(“Starting GC”); GC.Collect(); GC.WaitForPendingFinalizers(); Console.WriteLine(“GC Done”); }); task.Wait(); Console.Read(); } private static async Task Start() { Console.WriteLine(“Start”); Synchronizer sync = new Synchronizer(); var task = sync.SynchronizeAsync(); await task; GC.KeepAlive(sync);//Keep alive or any method call doesn’t help sync.Dispose();//I need […]

内存泄漏问题

自从我被要求修复一个有内存泄漏问题的C#应用​​程序以来,我一直在阅读很多内容,但我没有找到这两个问题的答案: 请考虑以下代码: private static ArrayList list = new ArrayList(); public void Function() { list.add(object1); list.add(object2); //didn’t call clear() prior to reusing list list = new ArrayList(); } 由于列表在创建新列表之前未被清除,这是否会产生某种垃圾,在静态列表本身被释放后不会被释放? 第二个问题是关于Form.Dispose()。 我看到设计师视图(即标签,图片框)上的许多控件都需要进行处理。 似乎在Form上调用Dispose()会导致所有这些类型的控件也被处理掉(如果我错了,请纠正我),这很奇怪,因为设计师添加了一个覆盖的void Dispose(bool disposing)方法,没有这样的事。 我假设这发生在基本Form类的void Dispose(bool disposing)方法中。 上面的问题是我不清楚我需要做些什么才能确保正确处理所有Form的资源。 我不明白Form如何知道它需要处理哪些对象。 例如,如果在我的表单中我有一个自定义IDisposable对象的字段,表单是否知道它需要处理? 或者我应该添加自己发布对象所需的代码? 另外,如果我确实需要添加代码来处理某些对象,那么我该如何处理设计者已经覆盖void Dispose(bool disposing)方法的事实呢? 我应该编辑设计器生成的代码还是有更简洁的方法来执行此操作? 我希望这不要令人困惑,这有点难以解释。 谢谢

为什么垃圾收集器以错误的顺序获取对象?

我有一个带有两个类A和B的应用程序。类A在类B的引用内部。类的析构函数执行一些资源清理,但它们必须按正确的顺序调用,首先是A的析构函数和那么B的析构函数 发生的事情是,以某种方式首先调用B的析构函数,然后A的析构函数崩溃,因为它试图从已处置的对象执行方法。 GC的这种行为是否正确? 我希望GC检测到A有对B的引用,然后先调用A析构函数。 我对吗? 谢谢你的队友! PD:如果对析破器/终结器/处理器等有疑问,那就是我们所拥有的: ~A() { this.Dispose(); } ~B() { this.Dispose(); }

为什么“Finalize方法不应该引用任何其他对象”?

我一直在思考为什么建议我们不要在finalize中释放托管资源。 如果您在http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx上看到代码示例,并搜索字符串“Dispose(bool disposing)在两个不同的场景中执行”并阅读评论,你会明白我的意思。 我能想到的唯一可能性是它可能与以下事实有关:无法预测终结器何时被调用。 有谁知道正确的答案? 谢谢,误导

在.NET中,实习字符串是否从垃圾收集中排除?

我正在努力减少进行Gen2收集所需的时间。 我的应用程序创建并保存了大量的字符串对象,这些对象在其生命中持续存在。 减少扫描对象的数量应减少GC时间。 我想知道实习池是否被排除在垃圾收集之外。 无论如何,没有任何东西要收集。 如果是这样,我可以实习所有这些字符串并加速GC。

SafeHandle和HandleRef

在阅读了这两个内容后,包括在这个网站上的高投票答案,我仍然觉得这有点不清楚。 由于我对此事的理解可能是错误的,我将首先发布我所知道的概要,以便我可以纠正如果我错了,然后发布我的具体问题: 有时在编写托管代码时,我们必须将地址传递给非托管代码。 这就是IntPtr的用途。 但是,我们尝试确保两个相反的事情:a)保持指针(到一个地址)从GC中存活。 b)在不需要时释放它(即使我们忘记明确地这样做)。 HandleRef执行第一个,SafeHandle执行第二个。 (我实际上是指这里列出的SafeHandle的派生词)。 我的问题: 显然,我想确认两者。 那么我该如何获得该function呢? (这是主要问题。) 从这里和从MSDN (“调用一个托管对象”)看起来只有someObject.Handle可能是GC’d,而一个独立的IntPtr不会。 但IntPtr 本身是管理的! IntPtr如何在超出范围之前进行GC(如此处所述)?