如何解决H5游戏的内存泄露

  • 概述
  • 内存分析步骤
    • 记录第一个快照
    • 记录第二个快照
    • 分析内存数据
  • 容易造成内存泄露的情况
  • 如何尽量避免内存泄露

概述

Chrome 提供了一个很好的内存分析工具,可以帮忙分析 H5 游戏哪些地方有内存泄露的问题。
此方法也适用于微信小游戏,或者各种 oppo,vivo,抖音等等小游戏系列。

内存分析步骤

首先进入要调试的 H5 游戏,然后按 F12 快捷键打开调试器。

点击“内存”页签,可以看到默认选中“堆快照”,如果点击“拍摄快照”按钮,则会马上记录当前的内存快照数据,在记录之前,会自动先进行GC清理(相当于点击了左边那个小垃圾桶图标)。

注意这里不包含显存纹理。

记录第一个快照

针对我们要检查内存泄露的界面,可以先打开关闭几次,让内存稳定下来,然后在界面关闭的情况下,点击记录快照。

这时可以看到左边栏出现一个“快照1”,这时候的内存已经经过GC清理。

右边红框显示的是记录那一刻,内存里的实例。
里面不仅包含我们游戏代码里的数据,还会包含一些浏览器用到的系统变量,编译数据等等,大家要仔细分辨。

记录第二个快照

我们再次打开刚才的游戏界面,然后关闭。
点击左上角的实心圆按钮(相当于第一步的按钮“拍摄快照”),记录第二次内存快照。

可以看到左边生成了“快照2”。
这时候我们可以点击“比较”按钮,会自动跟“快照1”进行比对,计算出新增、删除的对象数据。

分析内存数据

下面我们来分析一下内存数据。
图中有很多数据,新增的对象数很多,已删除的也很多,我们可以点击“增量”来排序一下。
留意增量是+正数的数据,特别是已删除项很少甚至是0的数据,这些是最有可能内存泄露的。

Detached 开头的可以不用管,不是我们的游戏对象。


点击其中一项数据,展开三角形,可以看到一个对象实例列表,@2495323这些数字就是实例产生的序号,按顺序排列下来。
上面是新增,下面的删除,一般来说,第一个新增的实例序号跟第一个删除的实例序号是一样的,会一一对应下来。
所以没移除的新增项,通常就是第一个删除项上面那几个。

点击这些新增项,可以看到下面的对象观察窗口,显示了该对象的引用链。
这个链要倒着看,就是从子到父这样看。
鼠标停留在链上,等几秒后可以看到该变量的值。

通常只拍摄两次,不足以说明该对象实例内存泄露了。因为有可能游戏的业务逻辑里,是延迟回收的。
我们可以重复几次上面的步骤,再继续拍摄几次,如果这个对象实例还是不断增加,那就有很大的嫌疑了。

容易造成内存泄露的情况

经验告诉我们,最容易造成内存泄露,通常是以下几点:
1、添加到界面的事件、通知,在界面销毁的时候,没有移除。尤其注意一些绑定到控件的事件,有些引擎是会自动释放(例如egret的Button事件),有些则是绑定在全局舞台上,例如egret的TOUCH_RELEASE_OUTSIDE 和 TOUCH_CANCEL,就必须要手动释放。
2、Tween 动画使用了 loop:true 特性的循环动画,在界面销毁的时候,没有移除。
3、绑定了闭包函数,在对象销毁的时候,没有解绑。
4、使用了对象池,但由于错误使用,导致了不断往对象池 push 实例。

如何尽量避免内存泄露

1、首先游戏框架很重要,一定要规范好 UI 的基类,统一进行事件的绑定与解绑。
2、对象池要做好自测。
3、新人培训要做好,初期培训的时候做好代码 review,尤其是头三个月。
4、定期进行内存泄露排查,比如一个月用 chrome 进行排查一次。

如何解决H5游戏的内存泄露相关推荐

  1. js垃圾回收机制,内存泄露和内存溢出,解决闭包产生的内存泄露详解

    一.内存的周期和回收机制 分配内存----->使用内存----->释放内存 1.JS 环境中分配的内存有如下声明周期: 内存分配:当我们声明变量.函数.对象的时候,系统会自动为他们分配内存 ...

  2. java 解决服务器上 关于内存泄露的实战

    1. 编写.sh脚本 在脚本中添加如下语句 启动脚本 #!/bin/bash #要运行的类的全路径类名 CLASS="com.kafka.TTThread" #先把之前启动的进程杀 ...

  3. 游戏测试内存泄露相关方案

    服务器相关: 1.压测过程中,监控服务器的内存变化.这种方案比较麻烦,但是可实施性比较高,最暴力的一种. 2.自动化,玩家上线后,操作后,然后理论上下线后除了已知的NPC,怪物对象外,不应该有其他对象 ...

  4. node.js 内存泄露问题之解决

    因项目需要,要借用node.js 作为 js引擎,解析动态生成的 js 语句,并将结果返回给调用者.因此,基于nodes.js ,实现了一个简单的 httpserver,针对请求,生成动态js 语句, ...

  5. 浅析NSTimer CADisplayLink内存泄露

    偶得前言 本篇文章中我们主要谈谈NSTimer\CADisplayLink在使用过程中牵扯到内存泄露的相关问题及解决思路(文章末尾会附上Demo),有时候我们在不知情的情况容易入坑,最关键你还不知道自 ...

  6. JVM内存管理概述与android内存泄露分析

    一.内存划分 将内存划分为六大部分,分别是PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量池以及本地方法栈. 1.PC寄存器(线程独有):全称是程序计数寄存器,它记载着每一个线程当前运行的 ...

  7. valgrind检测libevent内存泄露

    valgrind检测libevent内存泄露 github地址 在使用封装好的http库时,遇到了如下的内存泄露,一开始在definitely处还存在泄露,这里就不贴图了,已经被淹没了. 根据提示定位 ...

  8. threadlocal内存泄露_深入理解 ThreadLocal

    前言 上篇文章 https://juejin.im/post/5d712cedf265da03ea5a9ecf 中提到了获取线程的 Looper 是通过 ThreadLocal 来实现的: publi ...

  9. android弹出输入法内存,android 输入法导致内存泄露问题

    该方法侵入太高,必须重新EditText,如果我们直接使用一个第三方的控件包含了EditText,那么这么做就没有意义,所以放弃了这种方案,然后我又想出了其他方案,Android 输入法导致内存泄露以 ...

最新文章

  1. MySQL绿色版的安装
  2. HTTP Content-Length与分块传输
  3. 【论文解读】经典CNN对2D3D掌纹及掌静脉识别的性能评估
  4. 关于MongDB数据迁移方案的研究
  5. 解决git push 中remote: Permission to xxxxx.git denied to xxx. fatal: unable to access xxxx 403(转)
  6. python源码文件以什么格式结尾结尾_查看python源码,发现里面的函数都以pass结尾,那么意义何在?...
  7. std::reserves使用
  8. css3-3 css3背景样式
  9. Linux kill 多余用户终端
  10. javaScript的内置对象JSON
  11. hdu Robberies 2955 01背包
  12. 10074 启用开发者模式 for vs2015rc
  13. c语言中自定义函数的流程图这么画,c语言流程图怎么画?
  14. 嵌入式C语言自我修养分享课件
  15. php第三方分享插件下载地址,PhpWind安装分享插件
  16. 电脑未安装任何音频设备解决办法
  17. IAR+STVP烧录程序排错
  18. 心电监护仪数据图解_心电监护仪数据怎么看
  19. 计算机主机风扇安装方法,散热风扇怎么装 电脑机箱散热风扇安装图解教程 (全文)...
  20. Python调用华为API实现人脸检测

热门文章

  1. 1.4 使用电脑测试MC20的接收英文短信功能
  2. 2019迪安诊断半年度经营管理会议,“复盘”来了
  3. Qt网络编程-TcpServer入门Demo(2)
  4. linux文件分割命令性能,Linux系统下使用split命令分割大文件 (转载)
  5. duilib 模仿网易云音乐
  6. linux端口对应服务
  7. 在广州传智播客网页平面UI设计培训机构能学到什么?
  8. WWDC2019 ------深入理解App启动
  9. 远程桌面相关详细操作
  10. REST风格如何使用