在本教程中,我们将看到如何使用dotmemory优化你的应用程序的内存使用情况。

 

我们所说的什么“优化内存使用”?像在任何操作系统的过程中,垃圾收集(GC)消耗系统资源。逻辑很简单:更多的藏品GC已作出,较大的CPU开销和贫穷的应用性能。通常,这发生在你的应用程序分配大量的是时间有限的时期需要的对象。

 

识别和分析这些问题,你应该检查所谓记忆交通。交通信息显示你有多少个对象(记忆)被分配和选定的时间期间被释放。

 

让我们看看如何确定您的应用程序的过度分配和摆脱他们使用dotmemory。

 

目录

示例应用程序

步骤1。使用性能分析器

步骤2。得到的快照

步骤3。分析记忆交通

传统上,该示例应用程序将使用本教程是康威的生命游戏。在你开始之前,请下载并解压这个压缩包的应用。

 

随着大量的对象的应用程序(细胞),就看如何将这些对象被分配和收集有趣的动力学。

 

步骤1。运行剖面

1。打开在Visual Studio解决游戏人生。

2。使用菜单dotmemory |剖面启动项目运行dotmemory。

 

这将打开系统配置窗口。

1.  在探查器配置窗口:

在实际应用中,指定我们生命的释放游戏构建路径。

 

打开收集每n个对象在创建堆栈跟踪类别。这将创造的堆栈跟踪信息记录。我们需要此信息来确定哪些调用创建对象。

 

打开记忆的交通类收集。这将打开记忆的交通信息记录。

 

打开开始分析立即创造堆栈跟踪和内存的流量类别。这会告诉dotmemory开始收集这些信息在应用程序启动。

 

这就是窗户看起来应该像你指定的所有选项后:

 

4。单击“运行”开始分析会话。这将启动我们的应用程序和打开dotmemory主要分析页:

 

5。切换到dotmemory主窗口看到的时间表。时间线显示你的应用程序在实时内存使用。更具体地说,它提供了对非托管内存*,电流的大小细节0代,代,第二代和大对象堆成堆。直到生命的游戏开始,内存消耗是静止的:

 

 

步骤2。得到的快照

应用程序启动后,我们可以开始内存快照。我们想了解如何我们的应用程序的行为的动力,我们需要至少两个快照。得到的快照之间的时间将是进一步的内存的流量分析的主题。

 

当然,快照必须考虑人生的游戏操作部分的分配主要发生在当。我们在游戏中的第三十代以一个快照,并在第二个第一百代。

1.  使用“开始”按钮开始游戏中的应用。

 

 

2、(在我们的应用程序的右上角)达到30×,点击进入dotmemory快照按钮。

 

 

如果你看看现在的时间表,你会看到如何应用程序消耗的实时内存。当应用程序分配新的对象,内存消耗增加(0代图增长)。当垃圾收集发生,内存消耗降低。作为一个结果,时间如下一个锯状图案。

  1. 当代计数器达到100,得到一个快照,再利用得到的dotmemory快照按钮。

4。通过关闭应用程序的生命游戏结束分析会话。

 

主页包含两个快照:

 

 

步骤3。分析记忆交通

现在,我们将得到的快照之间的时间记忆的交通一看。

1。单击“添加到每个快照添加到比较区域比较。为了在你添加快照并不重要,因为dotmemory总是使用旧的快照作为比较基础:

 

2。点击查看内存的流量在比较:

 

这将打开查看流量。查看当前显示我们多少某种类型的对象之间创建快照和快照# # 1 2。

3. 采取看看列表。23 MB的,或关于内存的整体流量的50%,是由于细胞的类对象分配*。同时,大多数这些细胞–22.7 MB–以及收集。这很奇怪,因为细胞应该对任何游戏人生的整个持续时间的存在。毫无疑问,这些收藏品伤害我们的应用程序的性能。

 

让我们检查一下这些细胞的对象从哪里来。

4。单击“行与gameoflife细胞类:

 

 

该屏幕底部的列表显示功能(回溯),创建的对象。显然,这是calculatenextgeneration网格类方法。让我们在代码中找到它。

5。在Visual Studio中打开gameoflife溶液。

 

6。打开包含网格课实施grid.cs文件:

 

7。找到calculatenextgeneration(int排列,int)方法:

 

看来,这种方法计算并返回游戏的每一个生命的下一代细胞的对象。但这不能解释高内存交通。让我们回到dotmemory找出函数调用的calculatenextgeneration方法。

8。在dotmemory,扩大calculatenextgeneration方法查看堆栈中的下一个函数。

Grid 类的Update方法

 

 

9。在代码中找到这个方法:

 

本文最后揭示我国高内存交通的原因。有了单元类型存储游戏人生的下一代细胞的nextgenerationcells阵列。在每一代更新,此数组中的细胞用新的替换。从上一代留下的细胞不再需要收集一定时间后得到的气相色谱法。

 

显然,没有必要把nextgenerationcells数组中的每个时间作为应用程序的整个生命周期过程中存在着新的细胞阵列。摆脱高内存的交通,我们仅仅需要而创造新的细胞的新值更新现有的电池性能。让我们在代码中做这个。

 

10。实际上,我们的程序是一个学习的例子,它已经包含了所需要的calculatenextgeneration方法的实现。此方法更新单元格的IsAlive和年龄的领域进行引用发送:

 

 

为了解决这个问题,简单地取消在update()更新nextgenerationcells阵列使用这种方法的线。最后,该update()方法

 

现在,让我们应用这些更改并检查它们如何影响记忆的交通。

11.建立应用程序再一次。重复步骤1步骤。运行剖面和步骤2。要得到两个新的快照的快照。

12。开放交通的角度去看收集快照之间的记忆的交通(如子步骤1和2步骤3的方法。分析记忆交通):

 

该gameoflife。细胞类不再是名单上的!这导致在整体流量下降35%(34 MB),这是一个很好的优化。

 

posted on 2014-11-18 17:55  MarryQ  阅读(1092)  评论(0编辑  收藏  举报