在本教程中,我们将看到如何使用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. Java8-Lock-No.02

    import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util ...

  2. python自动华 (十)

    Python自动化 [第十篇]:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO 本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO   ...

  3. MySQL数据库有几种索引?分别是什么?

        5种索引     1.主键索引     2.唯一索引     3.普通索引     4.全文索引     5.联合索引

  4. 组件化网页开发 / 步骤二 · 2-11 jquery的ajax方法 以及下一章跨域没懂

    1,根据2-11课程老师的提示,自己封装 $.ajax 2,第三章,跨域,没看懂

  5. List根据某字段去重,以及compareTo 浅解

    原文链接:https://blog.csdn.net/qq_35788725/article/details/82259013 Collections.sort可对集合进行排序 根据List里面某个字 ...

  6. 牛客练习赛39 B.选点

    链接:https://ac.nowcoder.com/acm/contest/368/B 来源:牛客网 题目描述 有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi.现在要选出尽量多的点. 对于 ...

  7. Linux监控工具介绍系列——iostat

    文章转自:https://www.cnblogs.com/ghj1976/p/5691857.html Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iost ...

  8. CF1208A

    CF1208A 题意: 就是把斐波那契数列的+改成异或,求第n项的值. 解法: 又是一个人类智慧题,打表找规律. 可以发现答案在 $ a,b,a⊕b $ 三个数中循环 CODE: #include&l ...

  9. (八)爬虫之js调试(登陆知乎)

    上次爬取网易云音乐,折腾js调试了好久,难受....今天继续练练手,研究下知乎登陆,让痛苦更猛烈些. 1.简单分析 很容易就发现登陆的url=“https://www.zhihu.com/api/v3 ...

  10. LightGBM两种使用方式

    原生形式使用lightgbm(import lightgbm as lgb) import lightgbm as lgb from sklearn.metrics import mean_squar ...