1.1 内存定义
内存由可读写单元组成,表示一片可操作空间,开发者主动申请空间、使用空间、释放空间。内存主要存储变量等数据,局部变量当程序执行结束,且没有引用的时候就会随着消失,全局对象会始终存活到程序运行结束。
V8是一款主流的 JavaScript 执行引擎,V8内存分为新生代和老生代。V8内存的大小和操作系统有关:
- 64位为1.4G,新生代空间为64M,老生代为1400M
- 32位为0.7G,新生代空间为16M,老生代为700M
1.2 内存查看
- Node环境
通过process.memoryUsage() 查看内存使用情况,具体参数如下:
rss: V8申请到的总占用空间
heapTotal: 堆总内存
heapUsed: 已使用的内存
external: node专有(底层是c,额外申请到的c++内存 )
2. Chrome浏览器查看内存
打开开发者工作,在控制台输入window.performance.memory。
3. Performance工具
打开开发者工具 => 性能 => 勾选“内存”复选框 => 单击“记录”=> 随便访问网页。如下图所示:
点击停止后,生成如下报告,看JS堆的线条,幅度最大的地方就是内存使用最高的,如果内存一直居高不下,即表示没被回收,可能出现内存泄漏,展示图如下:
4. 堆块照查找分离 DOM
打开开发者工具 => 内存=> 单击“拍摄”=> 生成快照。如下图所示:
操作后再生成快照,在类筛选器框内,输入deta,如下:
输入deta可查看:
-
-
- 界面元素存活在DOM树上,
- 垃圾对象时的DOM节点 (节点不在当前dom树上,js中也没有人在引用)
- 分离状态的DOM节点 (不在当前dom树上,但是js有引用)
-
5. 任务管理器监控内存变化
shift+esc 调出浏览器自带的任务管理器,右击选中javascript内存。
6. Timeline 时序图记录
开发者工具–> 性能–>录制–>模拟用户行为
7. 确定是否频繁垃圾回收
GC工作时应用程序是停止的,频繁且过长的 GC 会导致应用假死,用户使用中感知到应用卡顿。可通过以下两种方式判断:
- Timeline 中频繁的上升下降
- 任务管理器中数据频繁的增加减小