dotMemory Unit 3.2 Help

与内存交互的替代方式

如果您不想以 处理内存 中描述的方式与内存交互,您可以选择另一种方式。 我们并未隐藏基于 dotMemoryApi 静态类的框架“内核”级别。 此类允许您直接操作内存快照,而无需使用 lambda 表达式。 实际上, dotMemory.Check 方法是对 dotMemoryApi 调用的封装。

您可以使用 dotMemoryApi 类编写自己的封装器,或者直接操作内存快照。

在后一种情况下,您需要注意以下特点:

  • 获取快照可能是一个耗时的操作。

  • 快照包含的是您获取它们时的内存数据,而不是您访问它们时的数据。

  • 如果测试代码中出现错误,测试运行器将无法区分测试失败是由于 dotMemory Unit 调用还是其他测试代码导致的。

  • 所有 dotMemory Unit 调用都应在检查是否启用了对 dotMemory Unit 的支持后进行。

例如,以下断言

dotMemory.Check(memory => { Assert.That(memory.GetObjects(where => where.Type.Is<Foo>()).ObjectsCount, Is.EqualTo(0)); });

可以重写为

if (dotMemoryApi.IsEnabled) { var snapshot1 = dotMemoryApi.GetSnapshot(); Assert.That(snapshot1.GetObjects(where => where.Type.Is<Foo>()).ObjectsCount, Is.EqualTo(0)); }

dotMemoryApi 静态类

dotMemoryApi 方法

名称

描述

GetSnapshot(): Snapshot

返回一个 Snapshot实例,该实例是当前执行点内存数据的引用。 使用此引用获取内存中对象的数据,将其与另一个快照的数据进行比较,或获取两个快照之间的内存流量数据。

GetDifference(Snapshot snapshot1, Snapshot snapshot2): SnapshotDifference

获取 snapshot1snapshot2 之间的差异。

返回一个 SnapshotDifference类型的实例,其中包含在获取快照的时间间隔内分配和收集的对象数据。

GetTrafficBetween(Snapshot snapshot1, Snapshot snapshot2): Traffic

获取在 snapshot1snapshot2 之间的时间间隔内的内存流量数据。

返回一个 Traffic 类型的实例,允许您获取在指定时间间隔内分配和回收的对象数据。

SaveCollectedData(string directoryPath)

保存包含单元测试运行期间收集的所有内存快照的工作区,使用 directoryPath 指定的目录路径。 这可以是完整路径,也可以是相对于被分析程序集的路径。

dotMemoryApi 属性

名称

类型

描述

IsEnabled

bool

如果测试在 dotMemory Unit 下运行,则返回 true。 在调用 Assert 语句之前检查此属性。

CollectAllocations

bool

定义是否必须收集内存分配数据(内存流量和创建堆栈跟踪数据)。 如果您需要断言的分配数据,请设置为 true。 请注意,这将显著增加分析开销。

Snapshot 类

表示某个执行点的内存数据。

Snapshot 方法

名称

描述

GetObjects(Func<ObjectProperty, Query> query): ObjectSet

(继承自 ObjectSet

通过特定条件获取对象的子集。 条件由 query 以 lambda 表达式的形式定义。 传递给 lambda 的 ObjectProperty 对象允许按类型、接口和其他参数选择对象。

返回一个 ObjectSet 类型的实例。

GroupByType: IReadOnlyCollection<TypeMemoryInfo>

(继承自 ObjectSet

返回一个 TypeMemoryInfo 类型的对象集合。 每个对象表示源对象集中某一特定类型,并携带该类型对象的数量及其总大小的信息。

Snapshot 属性

名称

类型

描述

ObjectsCount

int

(继承自 ObjectSet

内存中对象的总数。

SizeInBytes

long

(继承自 ObjectSet

内存中对象的总大小。

最后修改日期: 2025年 9月 28日