教程一、开始学习dotmemory
在本教程中,我们将学习如何运行dotMemory内存快照。此外,我们将简要地看看dotMemory的用户界面和基本分析的概念。考虑dotMemory本教程作为起点
基本条款:
你可能会问:“什么是内存快照和为什么我要学他们?”这是一个很好的时间来达成一些内存分析 您将在本教程中遇到。
从内存的角度来看,应用程序由连续的工作为新对象分配内存和释放内存的对象不再使用的应用程序。对象分配一个接一个地在所谓的托管堆(关于内存管理.net,遵循这个链接)。在此基础上,我们有两个基本操作内存分析器必须能够做:
1、 得到一个内存快照。快照是一个即时托管堆的形象。每个快照包含信息的所有对象,应用程序在内存中分配此刻你点击获取快照按钮。
2、 收集交通信息记忆。交通向您展示多少内存分配内存和释放字节/秒。这个信息也是非常有价值的,因为它允许您了解应用程序的动态执行。
你收集的时间在交通和快照(或者,换句话说,概要文件应用程序)被称为分析会话。
当然,还有其他一些条款,你会熟悉而教程。但是现在这足以理解发生了什么在接下来的几个步骤。让我们开始吧!
内容:
简单应用程序
1、 打开dotmemory
2、 得到一个快照
3、 熟悉快照的概述
4、 内存分析入门
5、 熟悉用户界面
首先,我们需要一个应用程序概要分析。通过一系列dotMemory教程,我们将使用一个用c#编写的应用程序。这模拟典型的康威的游戏生活,你可能知道。(如果不是,请检查维基百科。这不会花费很多时间,但将使更容易理解教程。)所以,在我们开始之前,请下载并解压缩档案与应用。
步骤一、1、运行dotmemory程序
2、 单击Profile按钮并选择我们的生活游戏程序是独立的应用程序。
3、 在分析器配置窗口
a.在应用程序中,指定我们的生活游戏可执行文件的路径。建议您总是概要文件版本构建的应用程序。
b.打开页面上的所有的复选框。我们将更详细地谈论他们在接下来的教程。
这就是窗户应该看起来像在你指定的选项:
4、单击Run启动分析会话。这将运行我们的应用程序并打开dotMemory主要分析页面
步骤二、得到一个快照
一旦应用程序正在运行,我们可以得到一个内存快照。在这个操作中最重要的事情是选择正确的时刻。你记住,一个快照的即时图像应用的托管堆。因此,拍摄快照之前你应该做的第一件事就是把你的应用程序状态你感兴趣。举例来说,如果我们想要看一下创建的对象生活的游戏应用程序启动之后,我们必须得到一个快照在采取任何行动之前应用。相反,如果我们需要知道对象是动态创建的,我们必须采取一个快照后单击“开始”的应用程序。
控制分析过程中,主要dotMemory页面包含一个按钮在页面的顶部。
1、 让我们假设我们需要时分配信息对象生命运行的游戏。因此,在应用程序点击开始按钮,让游戏运行一段时间
2、 单击“Get
Snapshot”按钮,得到一个快照信息
3、 关闭游戏程序结束性能分析过程
4、 查看dotMemory。主页现在包含快照的基本信息。
242.34 MB总意味着应用程序消耗242.34 MB的内存。这个尺寸等于Windows任务管理器的私有字节——内存要求的一个过程。总额包括:
a. Unmanaged memory 非托管内存——内存分配在托管堆之外,而不是由垃圾收集器。一般来说,这是所需要的内存.net CLR,动态库、图形缓冲区(特别是大WPF应用程序集中使用图形),等等。这部分内存分析器无法分析。
b. NET Free memory空闲内存——免费托管堆中的内存的数量(不使用的应用程序)。
c. . NET, used 显示为蓝色栏)——使用托管堆中的内存使用的应用程序。这是唯一的一部分记忆。网络允许您处理。出于这个原因,它也是唯一的一部分,你能够分析分析器。
让我们看一看更详细的快照。要做到这一点,点击快照# 1链接。
步骤三、熟悉快照概述
你看到后的第一件事打开快照是快照概述页面。页面显示热点在快照使用一些漂亮的图。
The Largest Size:最大的尺寸图展示的对象类型,消耗内存的主要部分。
The Largest Retained Size:最大的保留尺寸图展示您的关键对象——那些保存在内存中所有其他应用程序中的对象
The Heaps Fragmentation :托管堆的堆Fragmentationdiagram显示了碎片部分:代1、2和大对象堆。
dotMemory自动检查快照最常见类型的内存问题。这些检查的结果检查区域所示,它由一系列的检查:稀疏阵列,事件处理程序泄漏等等。
1、 单击“Largest
Size link”, 点击链接的最大尺寸。这将向您展示所有托管堆中的对象。
步骤四、内存分析入门
我们继续下去之前,让我们来一个小绕道和谈论的对象存储在内存中。这是需要更好的理解实际上dotMemory显示。
对象在内存中
主要的部分应用程序所消耗的内存分配给应用程序的对象。对象存储数据和引用其他对象。一个对象及其引用一个对象图。例如,图片类的一个对象将存储id字段(长简单类型)本身和参考其他领域(对象)。
应用程序根
*应用根的表是由运行时处理。
当你的应用程序需要的内存。净的垃圾收集器(GC)决定和删除不再需要的对象。要做到这一点,GC将每个对象的图根*,即静态字段、局部变量和外部处理。如果从任何根对象是遥不可及的,它被认为是不需要从内存中删除。在下面的示例中,D和F对象从内存将被删除,因为他们无法访问应用程序的根。
保留
这里我们来保留的关键概念。
一条从根到一个对象可能会通过许多其他对象。如果所有路径对象B通过对象,然后调用的统治者。换句话说,B是只保留在内存中,如果执行垃圾收集,B也将垃圾收集。这就是为什么每个对象的最重要的参数是保留对象的大小。在dotMemory,这个参数被称为保留字节。例如,在下面的例子中C的对象保留632个字节。对象B不仅仅是保留C;因此,它不包括在计算。
让我们回到dotMemory看看打开类型列表视图。这种观点目前向您展示所有对象在堆中,按他们只保留的内存数量。正如您可以看到的,主要由System.Windows.Shapes保留一部分。椭圆类(很显然,这些都是我们使用可视化的椭圆形状的游戏生活细胞)。该类型的对象保留11868900字节的内存,而消耗3862600字节。
步骤五、熟悉用户界面
1、 请看左边dotMemory窗口的一部分。这是分析路径,显示你所有的调查步骤
每项分析路径是你分析的主题。正如您可以看到的,你开始剖析GameOfLife。exe(步骤1),然后你打开快照# 1(第二步),最后(第三步)你问dotMemory向您展示所有对象在堆中。
即使是一个小小的应用程序创建许多对象,试图分析每个对象分别将不会非常有效。这就是为什么你的分析的主体dotMemory就是所谓的对象集。
对象集是由一个特定的条件选择的对象数。为了便于理解,认为一个对象集的一些查询的结果*(非常类似于SQL查询)。例如,您可以告诉dotMemory类似“选择所有对象由每年的();和提升为创2”,或“选择所有对象在内存中保留通过实例”,等等。
2、 可以从不同的角度检查每个对象集称为视图。查看列表中占据了屏幕的主要部分。类型列表视图,显示了一个简单的列表中的对象集。其他视图可以显示其他信息选择的设置。例如,该集团的绝对主力军视图将显示您保留选择的对象在内存中;该组织通过创建堆栈跟踪视图将显示您什么叫创建了对象,等等
3、 如前所述,每个主题分析可能导致你到另一个话题。例如,我们看到System.Windows.Shapes。椭圆类保留大部分的记忆,我们想知道它实际上保留对象。要做到这一点,打开上下文菜单System.Windows.Shapes.Elipse 对象并选择打开对象保留这组。
4、 这将打开对象集与保留对象的类型列表视图。
你刚才所做的是要求dotMemory”选择所有System.Windows.Shapes.Ellipse类的对象专门聘请的对象”。
分析路径现在包含两个主题:
Elipse.在这一步中,从所有对象,dotMemory 只选择System.Windows.Shapes.Elipse对象
Retained Object。在这一步中,dotMemory显示所有对象System.Windows.Shapes.Elipse聘请的对象
以这种方式,遵循从一个话题转到另一个分析和检查它们在不同的视图,你搬到你的记忆问题的原因。
5、实验dotMemory一点。例如,确定调用源自GameOfLife的对象。细胞类。