在本教程中,我们将看到如何使用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),这是一个很好的优化。

教程3 -如何与dotmemory内存优化交通的更多相关文章

  1. iOS高级教程:处理1000张图片的内存优化

    一.项目需求 在实际项目中,用户在上传图片时,有时会一次性上传大量的图片.在上传图片前,我们要进行一系列操作,比如:旋转图片为正确方向,压缩图片等,这些操作需要将图片加载到内存中,下面对内存的使用做详 ...

  2. Dotmemory 内存分析工具

    Dotmemory 内存分析工具 教程一.开始学习dotmemory 在本教程中,我们将学习如何运行dotMemory内存快照.此外,我们将简要地看看dotMemory的用户界面和基本分析的概念.考虑 ...

  3. Dotmemory 内存分析工具的操作手册

    教程一.开始学习dotmemory 在本教程中,我们将学习如何运行dotMemory内存快照.此外,我们将简要地看看dotMemory的用户界面和基本分析的概念.考虑dotMemory本教程作为起点 ...

  4. ANDROID内存优化——大汇总(转)

    原文作者博客:转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! ANDROID内存优化(大汇总——上) 写在最前: 本文的思路主要借鉴了20 ...

  5. 【MDCC技术大咖秀】Android内存优化之OOM

    大神分析的很全面,所以就转过来保存一份,转自:http://www.csdn.net/article/2015-09-18/2825737/1 以下为正文: Android的内存优化是性能优化中很重要 ...

  6. ANDROID内存优化(大汇总——中)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...

  7. Android内存优化之OOM

    内容大多都是和OOM有关的实践总结概要.理解错误或是偏差的地方,还请多包涵指正,谢谢!本人Q:1524447071 (一)Android的内存管理机制 Google在Android的官网上有这样一篇文 ...

  8. 【腾讯Bugly干货分享】Android内存优化总结&实践

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/2MsEAR9pQfMr1Sfs7cPdWQ 导语 智 ...

  9. 微擎开启性能优化里面的性能优化memcache内存优化及数据库读写分离

    http://www.mitusky.com/forum.php?mod=viewthread&tid=3135 [微擎 安装使用] 微擎开启性能优化里面的性能优化memcache内存优化及数 ...

随机推荐

  1. 用IE滤镜实现多种常用的CSS3效果

    CSS3是当下非常火的一个话题之一,很多浏览器都已经开始支持这一特性,然后IE这个拥有庞大用户群体的平台,却无法提供这样的支持,即便是IE9发布,也无法改变这一事实,然而,幸运的是,IE并非在这方面毫 ...

  2. python 实践--新闻聚合

    采集新闻,体会到面向问题和面向对象的区别. 如果希望新闻来源多出,比如NNTP,Web.可以实现:Source,Destination,NewItem,NewAgent. Scoure处理来源, De ...

  3. 敌兵布阵(HDU 1166)

    Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...

  4. <cmath>库函数

    C++ cmath库中的函数 今天模拟,想调用<cmath>中的函数,然鹅...突然忘了,所以还是总结一下吧 写法 作用 int abs(int i) 返回整型参数i的绝对值 double ...

  5. vue 使用 echart ,自定义样式案例

    1.vue 安装 echart 库 npm install echarts --save 2.vue代码 引入 let echarts = require("echarts/lib/echa ...

  6. JAVA RPC 生产级高可用RPC框架使用分享

    先放出链接,喜欢的给个star:https://gitee.com/a1234567891/koalas-rpc 一:项目介绍 koalas-RPC 个人作品,提供大家交流学习,有意见请私信,欢迎拍砖 ...

  7. 如何使用纯js实现一个带有灰色半透明背景的弹出框

    原文如何使用纯js实现一个带有灰色半透明背景的弹出框 // 加入透明背景 var body = document.body;var backgroundDiv = document.createEle ...

  8. 牛顿法与拟牛顿法(三) DFP算法

    转自 https://blog.csdn.net/itplus/article/details/21896981

  9. spring boot 原理解析一(spring boot 基础特征)

    spring boot 提供了完整的介绍 文档:https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/reference/html/documen ...

  10. python中使用requests模块的post()函数时形参 data和json的区别

    通常,你想要发送一些编码为表单形式的数据--非常像一个 HTML 表单.要实现这个,只需简单地传递一个字典给 data 参数.你的数据字典在发出请求时会自动编码为表单形式: >>> ...