gpt4 book ai didi

c# - 编写检查内存泄漏的测试。什么是可行的方法?

转载 作者:行者123 更新时间:2023-11-30 16:59:15 24 4
gpt4 key购买 nike

最近,我修复了一个漏洞,其中一个事件使一个实例保持事件状态。只用了几个星期,我不得不再次修复同一个对象的泄漏,因为有人添加了另一个导致泄漏的事件。

我现在正在考虑添加一些自动测试。此测试应创建对象、销毁对象并验证对象是否不再位于内存中。

我想写一些代码是不可能的:

Initialize();
var object = CreateObject();
Type type = object.GetType();
DestroyObject(object);
// There are a few objects that intentionally keep my object still alive
// up to a certain time.
DestroyFurtherObjectsWithReferenceToMyObject();
GC.Collect();
Assert.IsNull(FindInstanceOf(type));

我认为问题出在 FindInstanceOf 方法上。 GC 类 afaik 不提供这样的方法。

另一种方法是经常创建对象,每次都销毁它,然后比较总内存。
我觉得这种方法不太可靠。在我的例子中,我必须首先启动应用程序的许多部分(因此是上面的 Initialize)。创建和销毁对象后,我需要销毁一些持有引用的其他对象。
如果对那些其他对象进行了更改,这可能会对我的测试产生一些不良影响。不想在这里讲太多细节,但我的测试最终可能由于随机原因而失败的可能性并不大。

那么,找出某个对象是否保留在内存中的可能解决方案是什么?

最佳答案

没有为此公开的 API。但是,您可以“模仿”一些收藏家所做的工作。在幕后,一些 GC 类型只是保留一个映射

object reference <=> usage counter

当其他对象指向当前对象时,使用计数器会增加。当引用被释放时,计数器递减。您可以做的是为您的对象创建一个使用图,您可以在测试中检查它。示例代码

Initialize();
var object = CreateObject(); // calls ObjectUsageMap.IncrementCountFor(object);
DestroyObject(object); // calls ObjectUsageMap.DecrementCountFor(object);

// calls ObjectUsageMap.DecrementCountFor(object) inside next line
DestroyFurtherObjectsWithReferenceToMyObject();
GC.Collect();
Assert.AreEqual(0, ObjectUsageMap.GetCountFor(object));

关于c# - 编写检查内存泄漏的测试。什么是可行的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23908402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com