如何解决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. laravel Transformers中修改data键
  2. python语言程序设计基础第二版第六章答案-python语言程序设计基础(第二版)第五章答案随笔...
  3. qa 芯片测试_芯片测试术语介绍CP、FT、WAT
  4. 京东SSO单点登陆实现分析
  5. Linux 下, npm i 老是被killed 已杀死
  6. React面试题目录汇总
  7. esayexcel下载问题
  8. React 高级应用 -- 错误边界 Error Boundaries
  9. CSS标签选择器→教你如何使用
  10. 普通人翻身的希望?揭秘“元宇宙”到底是个啥玩意!
  11. JDK11下载和安装(windows)
  12. 软考高级系统架构设计师:软件系统建模方法及其应用
  13. 区块链开发之验证ETH地址的有效性
  14. Linux elf可执行文件加密
  15. mac软件卸载不干净?你没用对工具!!试试这款mac卸载神器!
  16. 如何使用Kotlin构建Android旋转旋钮以帮助儿子练习钢琴
  17. 什么是云监控,云监控工具
  18. Python——fitter包:拟合样本数据的分布
  19. 论文写作 计算机类顶会顶刊,及论文发表指导
  20. 呼叫中心系统的基本构成和二次开发思路

热门文章

  1. vue/cli的安装报错以及解决问题的方法
  2. css3波浪纹路_CSS Houdini实现动态波浪纹效果
  3. dpdk 收发包问题案例:使用不匹配的收发包函数触发的不收包问题定位
  4. Day837.StampedLock-Java 并发编程实战
  5. ofo退款新“套路”!押金换“金币” 买东西要另加钱
  6. 爱奇艺加入龙蜥社区,携手打造多元化视频生态底座
  7. 会员向上,广告向下:爱奇艺权衡之道不轻松
  8. python python控制台忽略警告信息
  9. GSCOOLINK GSV5010 HDMI1.4延长100m分配IC
  10. 数据结构算法-队列技术点